View滑动冲突的两种解决方式

原创 2016年09月13日 22:21:59

转载请注明出处
http://blog.csdn.net/guodongAndroid/article/details/52530227
本文来自【孫小逗的博客】

View滑动冲突的两种解决方式

1、外部拦截法

所谓外部拦截法是指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要此事件就不拦截,这样就可以解决滑动冲突问题,这种方法比较符合点击事件的分发机制。外部拦截法需要重写父容器的onInterceptTouchEvent方法,在内部做相应的拦截即可,这种方法的伪代码如下所示:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        boolean intercepted = false;
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        int action = ev.getAction();
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
            {
                intercepted = false;
                break;
            }

            case MotionEvent.ACTION_MOVE:
            {
                if (父容器需要当前点击事件)
                {
                    intercepted = true;
                }
                else
                {
                    intercepted = false;
                }

                break;
            }

            case MotionEvent.ACTION_UP:
            {
                intercepted = false;
                break;
            }

            default:
                break;
        }

        mLastXIntercept = x;
        mLastYIntercept = y;
        return intercepted;
    }

上述代码是外部拦截法的典型逻辑,针对不同的滑动冲突,只需要修改父容器需要当前点击事件的条件即可,其他均不需要修改而且也不能修改。在onInterceptTouchEvent方法中,首先是ACTION_DOWN这个事件,父容器必须返回false,即不拦截DOWN事件,这是因为一旦父容器拦截了DOWN事件,那么后续的MOVE和UP事件都会直接交由父容器处理,这个时候事件没法再传递给子元素了;其次是ACTION_MOVE事件,这个事件可以根据需求来决定是否拦截,如果父容器需要拦截就返回true,否则返回false;最后是ACTION_UP事件,这里必须返回false。

2、内部拦截法

内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器进行处理,这种方法不符合事件分发机制,需要配合requstDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显复杂,需要重写子元素的dispatchTouchEvent方法,这种方法的伪代码如下所示:

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        int action = ev.getAction();

        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
            {
                parentView.requestDisallowInterceptTouchEvent(true); // parentView为父容器
                break;
            }

            case MotionEvent.ACTION_MOVE:
            {
                int deltaX = x - mLastDiapatchX;
                int deltaY = y - mLastDiapatchY;
                if (父容器需要此点击事件)
                {
                    parentView.requestDisallowInterceptTouchEvent(false); // parentView为父容器
                }
                break;
            }

            case MotionEvent.ACTION_UP:
                break;

            default:
                break;
        }

        mLastDiapatchX = x;
        mLastDiapatchY = y;
        return super.dispatchTouchEvent(ev);
    }

上述代码是内部拦截法的典型代码,当面对不同的滑动冲突时只需要修改里面的条件即可,其他不需要改动而且也不能改动。除了子元素需要做处理以外,父容器也需要默认拦截除了ACTION_DOWN以外的其他事件,这样当子元素调用parentView.requestDisallowInterceptTouchEvent(false)方法时,父容器才能继续拦截所需事件。父容器为什么不拦截DOWN事件已在外部拦截法中叙述,父容器的改动如下所示:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        int action = ev.getAction();
        if (action == MotionEvent.ACTION_DOWN)
            return false;
        else
            return true;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

滑动冲突问题的简单解决思路

其实之所以《从源码角度分析android事件分发处理机制》这篇博客,是因为在此之前一个android群友遇到一个滑动冲突问题,然后帮助其解决过后才想起来要仔细分析研究,并完成了文章开头索索的那篇博客。...
  • chunqiuwei
  • chunqiuwei
  • 2015年12月09日 15:33
  • 3021

Android滑动冲突解决方法

Android滑动冲突解决方法滑动冲突首先讲解一下什么是滑动冲突。当你需要在一个ScrollView中嵌套使用ListView或者RecyclerView的时候你会发现只有ScrollView能够滑动...
  • tgbus18990140382
  • tgbus18990140382
  • 2016年12月26日 17:50
  • 601

Android 笔记 ViewPager的滑动与子view内部滑动事件的冲突问题

ViewPager 与子view的滑动冲突在上一次笔记中建设了一个可以滑动的photoView,显示图片,可以放大,滑动大部分时候这个自定义View会和ViewPager一起使用。也就是我们通常看到...
  • super_zq
  • super_zq
  • 2016年10月13日 14:14
  • 1442

Android中滑动事件冲突的处理方法

滑动是Android中不可缺少的一部分,多个滑动必然会产生冲突,比如我们最常见的是ScrollView中嵌套了ListView,一般做法是计算出ListView的总高度,这样就不用去滑动ListVie...
  • lylodyf
  • lylodyf
  • 2016年09月06日 09:04
  • 1836

android 可滑动组件互相嵌套时滑动冲突解决方案总结

参考文章: http://www.jianshu.com/p/87a41b8c0dd0 http://www.jianshu.com/p/8bc0765dffc9   强烈推荐使...
  • scry5566
  • scry5566
  • 2016年08月24日 11:52
  • 700

一个Demo带你彻底掌握View的滑动冲突

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。 最近在重新学习Android自定义View这一块的内容,遇到了平时开发中经常碰到的一个棘手问题:View的滑动冲...
  • tyk0910
  • tyk0910
  • 2016年11月30日 22:40
  • 5680

view的滑动冲突解决

今天看郭神和鸿神的公众号,学习了一下view解决冲突的办法。再次记录一下,供自己翻看的同时,也方便别人。 首先来看一个view的事件分发流程 ps:公司的网不知道怎莫回事,马丹的我不能传图片,只...
  • qdh186
  • qdh186
  • 2016年12月07日 22:03
  • 242

View的滑动冲突解决

一.滑动冲突的场景 当两个都可滑动的控件处于内外两层的关系时,这个时候我们往往会遇到滑动冲突的问题,比如最常见的ScrollView和ListView的冲突,就是最典型的一种滑动冲突场景 虽然能够滑...
  • My_First_ID
  • My_First_ID
  • 2016年09月18日 11:39
  • 219

scrollview 与自定义控件的上下滑动冲突

/**  * 能够兼容ViewPager的ScrollView  * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题  */ public cl...
  • LDD119
  • LDD119
  • 2013年12月18日 15:54
  • 1847

巧解ViewPager滑动冲突

在Android开发过程中,你一定会用到ViewPager这个控件,最让人头疼的就是各种滑动冲突,比如说:在ListView,SrollView中嵌套ViewPager,在作侧边栏滑动时和ViewPa...
  • ITjianghuxiaoxiong
  • ITjianghuxiaoxiong
  • 2015年04月08日 11:18
  • 7362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:View滑动冲突的两种解决方式
举报原因:
原因补充:

(最多只允许输入30个字)