学会了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之处)
- 只有ViewGroup中有onInterceptTouchEvent方法。
- 全程无拦截super的话流程是呈现u型的。(也就是正常的无拦截流程)
- diapatchTouchEvent和onTouchEvent方法这两方法只要返回true都是直接消费事件不在传递事件。
- onInterceptTouchEvent方法返回true的话是自己处理其他情况都是传递下一级处理。
- 这种处理模式很像拦截器模式,也叫责任链模式。(给下一个处理问题,算甩锅不,学会?)
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