View事件的分发规则
- public boolean dispatchTouchEvent(MotionEvent ev)
- public boolean onInterceptTouchEvent(MotionEvent ev)
- public boolean onTouchEvent(MotionEvent event)
注意:只有ViewGroup有onInterceptTouchEvent事件
1、dispatchTouchEvent
用于进行事件的分发,只要事件能传递到该View,就会执行该方法。返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent影响。
2、onInterceptTouchEvent
用于进行事件的拦截
MyLinearLayout中
return super.onInterceptTouchEvent(ev):
return true:拦截,将事件交给自己的onTouch(如果有设置过 onTouchListener的话)和onTouchEvent(如果onTouch返回true表示onTouch消耗了该事件,将不会调用onTouchEvent)来处理。
return false:不拦截,事件向下传递
同上图
3、onTouchEvent
处理点击事件
return super.onTouchEvent(ev):
不拦截touch事件
返回true:消耗当前事件,不再向下传递
过程同上图,只是没有了onclick事件
返回false:调用父容器的onTouchEvent,依此类推。如果都返回false。交给Activity处理。
这里我的MyTextView和MyLinearLayout的onTouchEvent都返回了false,所以事件就“向上传递“到了Activity
所以总结一下,View的事件分发机制的伪代码:
//父容器捕获touch事件
public boolean dispatchTouch(MotionEvent ev) {
boolean consume=false;
//传递给自己的onInterceptTouchEvent
if(this.onInterceptTouchEvent(ev)){
//返回true,表示我要拦截该touch事件自己处理
consume=this.onTouchEvent(ev);
//onTouchEvent处理完之后
if(this.onTouchEvent(ev)){
//事件被消耗,即事件处理完了
}else{
//不消耗事件,向上传递给父容器
this.parent.onTouchEvent(ev);
}
}else{
//返回false表示传递给子控件处理
consume=this.child.dispatchTouchEvent(ev);
return consume;
}
}