android 浅入浅出看一下事件传递

事件传递三大方法

  1. dispatchTouchEvent (分发事件 retrue ture 分发,false 不分发)
  2. onInterceptTouchEvent (拦截事件 etrue ture 拦截,false 不拦截)
  3. 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。

有错误的地方希望可以告诉我,一起进步,谢谢

猜你喜欢

转载自blog.csdn.net/yangyasong/article/details/68923601
今日推荐