事件分发机制表现与实现原理
http://blog.csdn.net/qq_23547831/article/details/51530671
表现图片来源: http://blog.csdn.net/chunqiuwei/article/details/41084921
ViewGroup # dispatchTouchEvent()
1 | // Handle an initial down. |
- 每个
MotionEvent.ACTION_DOWN
发生时会清除之前所有连续的动作并作为一系列动作的开端; - 当
MotionEvent.ACTION_DOWN
或存在动作接收对象时,默认不拦截动作;否则拦截动作;
View # dispatchTouchEvent(event)
ViewGroup # dispatchTouchEvent(event)
倒序循环判断当前从上方到下方的直接子View/ViewGroup
, 判断当前事件是否存在消费对象,递归判断,最终调用的是已经定义过的child # dispatchTouchEvent()
或者是View # dispatchTouchEvent(event)
View # dispatchTouchEvent(event)
返回true
的情况- 处理内部滚动事件
View # isEnabled()==true
,添加View $ OnTouchListener
并在OnTouchListener # onTouch()
返回true;View # onTouchEvent()
返回true;
如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。
完整代码如下:
1 | /** |
View # onTouchEvent(event)
- 点击和长按事件都会消耗当前事件返回true
全部代码如下:
1 | /** |