前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android滑动冲突解决方案

Android滑动冲突解决方案

作者头像
Zachary46
发布2021-04-19 18:00:44
5100
发布2021-04-19 18:00:44
举报
文章被收录于专栏:Zachary46Zachary46

外部拦截法

重写父View onInterceptTouchEvent方法就行:

代码语言:javascript
复制
    float latestX;
    float latestY;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean isIntercept = false;

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isIntercept = false;
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(ev.getRawX() - latestX);
                float dy = Math.abs(ev.getRawY() - latestY);
                if (dx > dy) {
                    isIntercept = true;
                } else {
                    isIntercept = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                isIntercept = false;
                break;
        }
        latestX = ev.getRawX();
        latestY = ev.getRawY();
        return isIntercept;
    }

内部拦截法

父View重写onInterceptTouchEvent方法:

代码语言:javascript
复制
   @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean isIntercept = false;
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            isIntercept = false;
        } else {
            isIntercept = true;
        }
        return isIntercept;
    }

然后子View重写dispatchTouchEvent方法:

代码语言:javascript
复制
   float latestX;
    float latestY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = Math.abs(ev.getRawX() - latestX);
                float dy = Math.abs(ev.getRawY() - latestY);
                if (dx > dy) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            latestX = ev.getRawX();
            latestY = ev.getRawY();
            return super.dispatchTouchEvent(ev);
        }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 外部拦截法
  • 内部拦截法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档