事件传递三大方法
- dispatchTouchEvent (分发事件 retrue ture 分发,false 不分发)
- onInterceptTouchEvent (拦截事件 etrue ture 拦截,false 不拦截)
- onTouchEvent (触摸事件 return true 消费,false 不消费)
浅入事件传递
在这里空洞的解释,就好像玩游戏的时候,你女朋友各种找事儿一样,永远的无法理解,那么咱们就来个儿童教学法吧,记住生活处处有真理,来个场景吧,祖孙三人一个苹果(只要咬了一口就不能给自己的子辈吃,但是可以给父辈吃),父辈拿到苹果舍不得吃往下传递给子辈儿,就是这个了,那么上面的三个事件就可以解释为
1. dispatchTouchEvent (从父辈拿苹果 retrue ture 拿,false 不拿)
2. onInterceptTouchEvent (给子辈儿苹果 etrue ture 不给,false 给)
3. onTouchEvent (吃苹果 return true 吃完,false 不吃完)
这里差一张图 大家可以用上面的思维考虑一下
事件传递常见问题
- view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者优先级如何?
答:onTouchListener优先级最高,如果onTouch方法返回 false ,那onTouchEvent就被调用了,返回true 就不会被调用。至于onClick 优先级最低。 - 点击事件的传递顺序如何?
答:Activity-Window-View。从上到下依次传递,当然了如果你最低的那个view onTouchEvent返回false 那就说明他不想处理 那就再往上抛,都不处理的话最终就还是让Activity自己处理了。
源码为
//activity的dispatchTouchEvent 方法 一开始就是交给window去处理的
//win的superDispatchTouchEvent 返回true 那就直接结束了 这个函数了。返回false就意味
//这事件没人处理,最终还是给activity的onTouchEvent 自己处理 这里的getwindow 其实就是phonewindow
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
//来看phonewindow的这个函数 直接把事件传递给了mDecor
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
//devorview就是 我们的rootview了 就是那个framelayout 我们的setContentView里面传递的那个layout
//就是这个decorview的 子view了
@Override
public final View getDecorView() {
if (mDecor == null) {
installDecor();
}
return mDecor;
}
- view的OnTouchListener的 onTouch ,和 onTouchEvent,OnClickListerner 方法 三者优先级如何?
答:onTouchListener优先级最高,如果onTouch方法返回 false(自己不消费) ,那onTouchEvent就被调用了,返回true(自己消费) 就不会被调用,至于onClick 优先级最低.
优先级如下:
OnTouchListener > onTouch > onTouchEvent > OnClickListerner - enable是否影响view的onTouchEvent返回值?
答:不影响,只要clickable和longClickable有一个为真,那么onTouchEvent就返回true。