Android事件传递机制:Touch Event System
Android事件传递机制跟布局的层次密切相关,一个典型的布局包括根节点ViewGroup,子ViewGroup,以及最末端的子View,如下图:
在这种结构中,上层是RootViewGroup,下层是子View,当我们点击子View的时候,点击事件从上层依次往下层传递,传递的过程调用dispatchTouchEvent和onInterceptTouchEvent函数。当事件传递到被点击的子View后,停止事件的传递,开始改变方向,依次向上层响应,响应的过程调用onTouch或onTouchEvent方法,如下图:
由于事件的传递和响应有明确的方向,因此我称之为“下沉传递,冒泡响应”。下面结合我写的一个Demo给出验证过程。Demo布局很简单,红色背景的LinearLayout包含一个绿色背景的LinearLayout,包含一个白色背景的Textview,3个层级。当点击Textview时,事件传递方向红-绿-白,响应的方向相反,白-绿-红,如下图:
Demo继承LinearLayout实现了一个MyLinearLayout,继承Textview实现了一个MyTextView,分别在dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent函数中添加日志输出:
public class MyLinearLayout extends LinearLayout {
...
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(MainActivity.TAG, getId() + " MyLinearLayout onInterceptTouchEvent");
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent