Android 事件分发机制 图解
下方有大图,直接点开看模糊, 放大网页可以看清楚。
设计事件需要考虑什么
分发流程图解
事件产生的过程
MotionEvent
MotionEvent是底层Linux用反射机制产生的一个事件。这个是事件分发的时候的方法参数。其结构是:
分发事件流程及思路
关于U型链
是属于八股了,网上找的图画了一下,讲真我自己都蒙,尽管我看过源码,也解决过关于事件传递拦截相关问题,但是看这张图也蒙圈,因为那这个图是恢复不了完整的不同对象调用关系的。 但是你跟别人解答(面试)的时候,他们可能拿的是这个答案,即使你知道怎么回事,答得跟下图不一样也会pass。尽管如此,但我还是建议多看看源码,哪怕记不清楚,忘了, 也比看二三手信息要接近真相。
事件冲突问题解决思路
Android自定义布局中经常出现一些事件冲突的问题。如:
- 外部滑动与内部滑动方向不一致,比如ViewPager包含ListView
- 外部滑动与内部滑动方向一致,比如ScrollView嵌套一个ListView
- 上述两种问题都有
如一个横向的ViewPager嵌套一个纵向的ListView
外部拦截法
外部拦截法,
让ViewPager直接重写onInteceptTouchEvent()方法。是横向的,就自己要,返回true。如果是纵向的,那事件留给其子view listView。
内部拦截法处理
内部拦截法就是,让两者中的子view必须感知到这个事件。 子view有个方法是
parent.requestDiasallowInterceptTouchEvent(true)
告知父组件不要拦截我的事件。