事件分发的关系伪代码:
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else{
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
1、一般情况是不对dispatchTouchEvent()进行改写的,通常是改写onInterceptTouchEvent、onTouchEvent以到达拦截事件的目的,当一个控件对某个事件拦截成功了,那么接下来同一系列的事件都将会有该控件来处理,此后onInterceptTouchEvent就不会被调用了
是否将事件交个某个控件处理,关键就是看ActionDown了,如果截获了ActionDown,那么接下来的事件都会由该控件处理,否则将交由其他控件处理。
2、关于onTouch()、onTouchEvent()、onClick()的优先级问题(onTouch()在OnToucheListener()中设置,onClick()在OnClickListenter()中设置)
onTouch>onTouchEvent>onClick
只有当onTouch反会false时,onTouchEvent才会被调用,只有当onTouchEvent返回false时,onClick才会被调用。
3、事件的传递顺序:Activity->Window->View
4、ViewGroup默认不拦截任何事件,即onInterceptTouchEvent()方法返回false。View没有onInterceptTouchEvent()方法,直接掉用onTouchEvent()方法,默认是会对事件进行消耗的,即返回true。
5、View的enable属性不会对onTouchEvent()的返回值产生影响,但clickable、longclickable属性会。
转载请注明原文地址: https://ju.6miu.com/read-1125341.html