android事件分发学习

来源:互联网 发布:python 风控规则引擎 编辑:程序博客网 时间:2024/06/05 12:00

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