Touch事件传递学习笔记

  • 事件分发的对象
    Touch事件
    当用户触摸屏幕时(View 或 ViewGroup派生的控件),将产生点击事件(Touch事件)
    Touch事件的相关细节(发生触摸的位置、时间等)被封装成MotionEvent对象
    产生的MotionEvent对象最终要交给一个具体的View去处理

  • 事件列
    从手指接触屏幕 到手指离开屏幕,产生的一系列事件


    Touch事件传递学习笔记_第1张图片
    事件列
  • 事件的分发
    将点击事件(MotionEvent)传递到某个具体的View 处理的整个过程

  • 处理事件分发的对象


    Touch事件传递学习笔记_第2张图片
    事件分发的对象
  • 事件分发的顺序
    即 事件传递的顺序:Activity -> ViewGroup -> View

  • 事件分发过程由哪些方法协作完成?
    dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()

  • Activity的事件分发机制


    Touch事件传递学习笔记_第3张图片
    Activity的事件分发机制
  • Activity的事件分发机制总结


    Touch事件传递学习笔记_第4张图片
    Activity的事件分发机制总结
  • ViewGroup的事件分发机制


    Touch事件传递学习笔记_第5张图片
    ViewGroup的事件分发机制
  • ViewGroup的事件分发机制总结


    Touch事件传递学习笔记_第6张图片
    ViewGroup的事件分发机制总结
  • View的事件分发机制


    Touch事件传递学习笔记_第7张图片
    View的事件分发机制
  • View的事件分发总结


    Touch事件传递学习笔记_第8张图片
    View的事件分发总结

总结:


Touch事件传递学习笔记_第9张图片
总结
  • 对于 dispatchTouchEvent,onTouchEvent,return true是终结事件传递。return false 是回溯到父View的onTouchEvent方法
  • ViewGroup 想把自己分发给自己的onTouchEvent,需要拦截器onInterceptTouchEvent方法return true 把事件拦截下来。
  • ViewGroup 的拦截器onInterceptTouchEvent 默认是不拦截的,所以return super.onInterceptTouchEvent()=return false;
  • View 没有拦截器,为了让View可以把事件分发给自己的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给自己的onTouchEvent

对于ACTION_MOVE、ACTION_UP总结:ACTION_DOWN事件在哪个控件消费了(return true), 那么ACTION_MOVE和ACTION_UP就会从上往下(通过dispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传,如果ACTION_DOWN事件是在dispatchTouchEvent消费,那么事件到此为止停止传递,如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。

你可能感兴趣的:(Touch事件传递学习笔记)