其他分享
首页 > 其他分享> > 学会了Android事件分发可以甩锅?

学会了Android事件分发可以甩锅?

作者:互联网

“生命周而复始又乏味之至,而只有当你觉得它可爱时,它才会变得可爱如斯。”

时隔四季,我从新开始了我的文章更新,so do you miss me?
在这里插入图片描述

前言

从工作到现在,我是个三年的程序员了,但是觉得自己掌握的知识很碎片化。所以决定把我学到的知识点,系统性的归纳和记录,所以CSDN,爷回来了。
在这里插入图片描述
错了,是干净的回来了
在这里插入图片描述

1.事件是啥

在这里插入图片描述
听我慢慢道来。
触摸,按键,轨迹球啥的都是事件。(通常第一种,第二种不多用,第三种很不常见,了解就行)
如果不知道轨迹球是个啥的话,可以链接了解一下:罗技M570轨迹球鼠标

2.事件类型

思考下等下说给你听。在这里插入图片描述
触摸事件类型,MotionEvent典型的三个事件:
ACTION_DOWN、ACTION_MOVE、ACTION_UP(当然还有个ACTION_CANCEL)
ACTION_DOWN:点击
ACTION_MOVE:没抬起在滑动
ACTION_UP:抬起
ACTION_CANCEL:事件异常

3.事件传递

上面的事件类型都会走到Activity的dispatchTouchEvent方法。
Activity–>Window–>DecorView–>子元素(ViewGroup–>ViewGroup–>View)
直接上图Activity、ViewGroup和View的如下:
在这里插入图片描述

3.1看图总结:(还是很重要的,主要是可以凸显你的NB之处)

  1. 只有ViewGroup中有onInterceptTouchEvent方法。
  2. 全程无拦截super的话流程是呈现u型的。(也就是正常的无拦截流程)
  3. diapatchTouchEvent和onTouchEvent方法这两方法只要返回true都是直接消费事件不在传递事件。
  4. onInterceptTouchEvent方法返回true的话是自己处理其他情况都是传递下一级处理。
  5. 这种处理模式很像拦截器模式,也叫责任链模式。(给下一个处理问题,算甩锅不,学会?)
    在这里插入图片描述

4.解决冲突

在这里插入图片描述

1.冲突ViewPage+Fragment(ListView)的左右上下冲突被ViewPage自己处理了。(我们大多数不需要去调整)
2.只有ScrollView和ListView有冲突了,但是编译器会直接提示出来,要你更换参数,合理调整。
3.自定义视图,用如下两种方法去解决,在子视图也依然能够滑动的,具体的冲突和业务效果你需要自己去考虑编码了。

//外部拦截法,在父视图重写它的onInterceptTouchEvent
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    boolean intercepted = false;
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_UP:
            intercepted = false;
            break;
        case MotionEvent.ACTION_MOVE:
            intercepted = true;
            break;
    }
    return intercepted;
}
//内部拦截法,在子视图重写它的dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            getParent().requestDisallowInterceptTouchEvent(false);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.dispatchTouchEvent(ev);
}

4.错误不足

请大佬私信指出(心里默念,我是没错的)
在这里插入图片描述

标签:case,分发,MotionEvent,break,事件,ACTION,Android,ev,甩锅
来源: https://blog.csdn.net/qq_41816123/article/details/120770103