android事件分发学习
很久没有记录博客了,感觉看的很多但是记录的确实挺少,最近系统的看了关于事件分发的模块的内容,记录一下自己的学习轨迹
- 所有的事件的传递分为三个阶段
- 分发(Dispatch)对应事件dispatchTouchEvent
- 拦截(Intercept)对应事件onInterceptTouchEvent
- 消费(Consume)对应着onTouchEvent方法
dispatchTouchEvent方法
- 存在于ViewGroup及其子类中,当返回true时候便表示当前视图被消费掉,返回super会继续分发事件
- 如果当前视图是viewGroup还会调用onInterceptTouchEvent方法,如果返回super和false则不会拦截
onInterceptTouchEvent方法
- 这个方法只存在于viewGroup及其子类中,在view和acvity中是不存在的,返回true表示拦截,其他表示不进行拦截
onTouchEvent方法
- 返回值为false时候表示当前视图不处理这个时间同时将时间传回父控件进行处理,将会调用父类控件的onTouchEvent进行处理
不同类的持有的方法分类
-
不同事件处理如下 :
Activity
- dispatchTouchEvent
- onTouchEvent ViewGroup
- dispatchTouchEvent
- onInterceptTouchEvent
- dispatchTouchEvent View
- dispatchTouchEvent
- onTouchEvent
总结
- 所有的事件都是从当前activity进行传递,通过 dispatchTouchEvent进行判断,如果满足super则进行分发,同时下发给每一个viewGroup,每一个viewGroup对自己的子控件进行事件的分发,同时viewGroup可以进行事件的拦截,当所有的子控件返回super或者false时候,则事件将会向外传递,调用父类控件的onTouchEvent,如果还是false将会调用activity的onTouchEvent。
最后附上 群主的总结,如果喜欢也可以去看他的博客:android 事件分发
触摸控件(View)首先执行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先执行onTouch方法,后执行onClick方法(onClick方法在onTouchEvent中执行,下面会分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener为null(控件没有设置setOnTouchListener方法)或者控件不是enable的情况下会调运onTouchEvent,dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件不是enable的设置了onTouch方法也不会执行,只能通过重写控件的onTouchEvent方法处理(上面已经处理分析了),dispatchTouchEvent返回值与onTouchEvent返回一样。
如果控件(View)是enable且onTouch返回true情况下,dispatchTouchEvent直接返回true,不会调用onTouchEvent方法。
总的来说dispatchTouchEvent->onTouch->onTouchEvent->onClick