View的手势分发

1.Touch事件分发流程


Touch事件分发流程
特别提醒:

  1. View是没有onInterceptTouchEvent拦截方法的
  1. 一般情况下,View都会消耗事件(onTouchEvent返回true),除非它们是不可点击的(clickable和longClickable都为false),那么就会交由父容器的onTouchEvent处理。 
  2. 不同控件super里面的处理可能不一样,此时要查看继承的控件的具体处理
  3. dispatchTouchEvent返回true时,不会继续分发事件,自己内部处理了所有事件(ACTION_DOWN,ACTION_MOVE,ACTION_UP),一般不推荐
  4. 子View可以调用getParent().requestDisallowInterceptTouchEvent(true), 阻止父ViewGroup对其MOVE或者UP事件进行拦截
  5. 点击事件分发过程: dispatchTouchEvent—->OnTouchListener.onTouch—->onTouchEvent–>OnClickListener.onClick,如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。

2.Touch事件类型


Touch事件类型
特别提醒:

ACTION_CANCEL一般认为不能由用户主动触发。系统在运行到一定程度下无法继续响应你的后续动作时会产生此事件。一般仅在代码中将其视为异常分支情况处理。

Move事件接受流程:

只有消费了ACTION_DOWN(返回true),才会收到ACTION_MOVE和ACTION_UP的事件

红色的箭头代表ACTION_DOWN 事件的流向
蓝色的箭头代表ACTION_MOVE 和 ACTION_UP 事件的流向

3.View坐标系

小蓝点代表手势点
View坐标系

4.Activity的视图框架

一个Touch事件产生后,它的传递过程为: Activity->Window->View。

参考目录


  1. 图解 Android 事件分发机制
  2. Android View和ViewGroup事件分发机制源码分析
  3. Android MotionEvent详解
  4. Android笔记:触摸事件的分析与总结--MotionEvent对象
  5. 自定义View系列教程06--详解View的Touch事件处理
2016-10-29 13:437