1,事件分发机制
- 事件分发:dispatchTouchEvent(),每个view只要事件能够到达,就会触发这个方法,返回结果受当前view的onTouchEvent的返回结果和下级View的dispatchTouchEvent的结果影响,结果表示是否消耗了当前事件。
- 事件拦截:onInterceptTouchEvent():在dispatchTouchEvent的处理中,处理是否拦截当前的事件,如果拦截当前的事件,就在当前view中处理当前的事件,结果表示是否拦截此事件。
- 事件响应:onTouchEvent():如果当前ViewGroup拦截了事件,或分发到当前View中,会触发此事件,结果表示是否消耗此事件。
- 三者关系如下:
//伪代码
public boolean dispatchTouchEvent(MotionEvent ev)
{
boolean consume = false;
if (onInterceptTouchEvent(ev))
{
consume = onTouchEvent(ev);
}
else
{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
2,事件分发机制的一些总结:
某个View一旦开始处理事件,但是没有消耗ACTION_DOWN,该事件会重新交给父级元素处理。其它事件,则不会交给父级元素处理,事件直接结束。
ViewGroup默认不拦截任何事件,View没有onInterceptTouchEvent方法,一旦接收到事件,直接触发onToucheEvent,且View默认不消耗事件,除非它可点击的。
-
onTouchEvent和onToucheListener,onClickListener,setTouchDelegate之间的关系:
- onTouchListener自定义了事件处理方法,它的优先级最高,会先响应它的方法。如果没有定义,才会执行系统的onTouchEvent的方法
- onClickListener是由多个onTouchEvent事件组成,所以它的触发是最晚的,优先级最低
- setTouchDelegate自定义的View的作用范围,如果设置它,会优先响应它的onTouchEvent.