1.点击事件的三个重要方法:
dispatchTouchEvent(MotionEvent ev)--用来进行事件的分发。如果当前事件能够传递给当前view,那么此方法一定会被调用。
onInterceptTouchEvent(MotionEvent ev)--用来进行时间的拦截。返回结果表示是否拦截当前事件。(在dispatchTouchEvent()中调用,#view没有提供这个方法)
onTouchEvent(MotionEvent ev)--用来处理点击事件。(在dispatchTouchEvent()中调用)
2.View的分发机制:
1.当点击事件产生以后,事件首先会传递给当前的Activity,调用其Activity的dispatchTouchEvent()方法,处理工作交给Activity的PhoneWindow来完成,PhoneWindow把工作交给DecorView,DecorView再拔事件处理交由ViewGroup。 Activity→PhoneWindow→DecorView→ViewGroup
2.当ViewGroup要拦截时间的时候。那么后续的时间也会交由他处理,而不再调用onInterceptTouchEvent()的方法了。
3.onInterceptTouchEvent()方法默认返回false,不进行拦截。如果想要让ViewGroup拦截事件那么需要在自定义VIewGroup中重写这个方法。
4.View的onTouchEvent()默认都会消费事件(返回为true),除非它是不可点击(clickable和longClickable同时为false)。
5.onInterceptTouchEvent()和onTouchEvent()方法都在dispatchTouchEvent方法中调用。
6.如果某个View一决定拦截,那么它的onInterceptTouchEvent()方法不会再被调用,同一事件的其他方法都交给它处理。
7.一般在事件传递中只回考虑ViewGroup的onInterceptTouchEvent()方法,因为一般不会重写dispatchTouchEvent()方法,如果ViewGroup的onInterceptTouchEvent()方法返回为ture,则表示要拦截该事件,就会交由onTouchEvent()方法处理。返回为false,表示不拦截这个事件。则会交给它的子元素dispatchTouchEvent()来处理,如此反复下去。
public booleandispatchTouchEvent(MotionEvent ev) {
boolean consume=false;
if(onIntetceptTouchEvent(ev)){
consume=onTouchEvent(ev);
}else{
consume=child.dispatchTouchEvent(ev);
}
return cousume;
}
所以可以得出结论:为true,则表示处理了,消费了该事件,不继续传递,为false,则表示不处理,不消费该事件,继续传递。
网友评论