文章目录
Android 事件分发 系列文章目录
一、事件分发相关类和方法
二、Activity 的事件传递
1、Activity.dispatchTouchEvent 方法事件传递机制
2、Activity.onTouchEvent 方法事件传递机制
三、ViewGroup 的事件传递
1、ViewGroup.dispatchTouchEvent 方法事件传递机制
2、ViewGroup.onInterceptTouchEvent 方法事件传递机制
3、ViewGroup.onTouchEvent 方法事件传递机制
四、View 的事件传递
1、View .dispatchTouchEvent 方法事件传递机制
2、View .onTouchEvent 方法事件传递机制
五、事件分发示意图
总结
一、事件分发相关类和方法
Android 事件分发涉及到的类有 3 33 个 , Activity , ViewGroup , View ;
Android 事件分发涉及到的如下 7 77 个方法 :
Activity 类涉及到 dispatchTouchEvent , onTouchEvent , 2 22 个方法 ;
public class MainActivity extends AppCompatActivity {
@Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } }
ViewGroup 涉及到 dispatchTouchEvent , onInterceptTouchEvent , onTouchEvent , 3 33 个方法 ;
public class MyConstraintLayout extends ConstraintLayout { @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } }
View 涉及到 dispatchTouchEvent , onTouchEvent , 2 22 个方法 ;
public class MyButton extends androidx.appcompat.widget.AppCompatButton {
@Override public boolean dispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } }
二、Activity 的事件传递
1、Activity.dispatchTouchEvent 方法事件传递机制
事件来源 :
① 驱动层产生触摸事件, 由 WindowManagerService 传递到 Activity
事件分发 :
① 停止传递 : 如果返回 true / false , 说明事件被消费 , 停止传递
② 继续传递 : 如果返回 super.dispatchTouchEvent(ev) , 那么继续向下传递, 按照如下顺序逐层传递 : Activity -> PhoneWindow -> DecorView -> ViewGrope , 最终传递到 ViewGroup, 调用 ViewGroup 的 dispatchTouchEvent 方法
/** * 该方法是页面事件分发入口 * * 针对 ACTION_DOWN 事件分析 : * 事件来源 : * 驱动层产生触摸事件, 由 WindowManagerService 传递到 Activity * 事件分发 : * 如果返回 true / false, 说明事件被消费, 停止传递 * 如果返回 super.dispatchTouchEvent(ev), 那么继续向下传递, 按照如下顺序逐层传递 : * Activity -> PhoneWindow -> DecorView -> ViewGrope * 最终传递到 ViewGroup, 调用 ViewGroup 的 dispatchTouchEvent 方法 * * @param ev * @return */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); }