android 事件分发机制学习
这个图不错,借用下
http://blog.csdn.net/H176Nhx7/article/details/79072310
布局如下:
<event.TouchEventViewGroup
android:id="@+id/touchEventViewGroup1"
android:background="#55ff0000"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<event.TouchEventView
android:id="@+id/touchEventView1"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#550000ff" />
</event.TouchEventViewGroup>
Activity代码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.err.println(tag+"=========onTouchEvent======"+event.getAction());
return super.onTouchEvent(event);
}
ViewGroup的代码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.err.println(tag+"=========onTouchEvent======"+event.getAction());
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
System.err.println(tag+"=========onInterceptTouchEvent======"+ev.getAction());
return super.onInterceptTouchEvent(ev);
}
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
System.err.println(tag+"=========requestDisallowInterceptTouchEvent======"+disallowIntercept);
super.requestDisallowInterceptTouchEvent(disallowIntercept);
}
View的代码如下
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.err.println(tag+"=========dispatchTouchEvent======"+event.getAction());
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.err.println(tag+"=========onTouchEvent======"+event.getAction());
return super.onTouchEvent(event);
}
点击一下,日志如下图
image.png
可以看到,在不做任何处理的时候,actionDown流程是
activity的dispatchTouchEvent-----------------viewGroup的 dispatchTouchEvent>>onInterceptTouchEvent-------------View的
disptchTouchEvent>>onTouchEvent----------ViewGroup的onTouchEvent--------activity的onTouchEvent.
上边为啥强调actionDown。那是因为,如果在actiondown的时候,onTouchEvent没有返回true,那么后续的actionMove,actionCancel,actionUp等事件都不会再传给这个View了。所以我们看日志可以发现,actionMove也就是2和actionUp也就是1,都直接在activity里消费了。
修改下TouchEventViewGroup代码如下,我们消费action_down事件,返回ture。
@Override
public boolean onTouchEvent(MotionEvent event) {
System.err.println(tag+"=========onTouchEvent======"+event.getAction());
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
}
return super.onTouchEvent(event);
}
日志:可以看到,TouchEventViewGroup对于后续的action_move和action_up都能接收到了,不过需要说明下onTouchEvent如果某个action返回了true,那么其他地方就不会处理这个事件了。比如TouchEventViewGroup里的ontouchEvent里如果action_down和action_move都返回true,那么activity里就接收不到这两个事件了。
image.png
继续修改代码,把上边的代码放到自定义TouchEventView里
@Override
public boolean onTouchEvent(MotionEvent event) {
System.err.println(tag+"=========onTouchEvent======"+event.getAction());
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
return true;
}
return super.onTouchEvent(event);
}
日志如下:结果是和预料的一样,说明理解是对的
image.png