Android触摸事件-03Activity触摸事件及源码分析
Activity的事件分发 dispatchTouchEvent
- 源码
public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); }
- 首先会触发Activity的dispatchTouchEvent方法。
- 接着会调用getWindow().superDispatchTouchEvent(ev),通过调用到Activity所属Window的superDispatchTouchEvent,进而调用到Window(PhoneWindow)的DecorView的superDispatchTouchEvent,因为DecorView是继承于Framelayout的,进一步的又调用到ViewGroup的dispatchTouchEvent()。
- 事件的分发顺序,先分发给它所包含的View(通过setContentView()),只有它所属View对事件不感兴趣的话,即返回false,才会分发给Activity
- 【Android触摸事件-03Activity触摸事件及源码分析】activity的onTouchEvent
public boolean onTouchEvent(MotionEvent event) { if (mWindow.shouldCloseOnTouch(this, event)) { finish(); return true; }return false; }
/** @hide */ public boolean shouldCloseOnTouch(Context context, MotionEvent event) { if (mCloseOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(context, event) && peekDecorView() != null) { return true; } return false; }
- 通过检查mCloseOnTouchOutside标记,触摸事件是否为ACTION_DOWN事件,同时判断event的x、y坐标是不是超出Bounds,然后检查FrameLayout的content的id的DecorView不为空, 如果这些都满足的话,则finish掉activity,可以参考Dialog型式的Activity
推荐阅读
- Android Kotlin语言学习第三课(自定义ContentProvider和SQlite学习增删改查)
- 链得得|【大文观链】六年后,DAO终于摆脱了The DAO事件的余波
- Java|使用两个注解,三步完成SpringBoot事件监听(反射,切面实现)
- k8s|基于 keda事件驱动在Kubernete 集群上的弹性自动缩放应用
- Android|Android 控制软键盘,亲测最好用!
- 对榆林产妇跳楼事件的思索
- Android中的自定义View(二)
- Android面试题|OkHttp原理解析之连接拦截器
- 觉察日记7
- 前端面试之3-8|前端面试之3-8 DOM事件(二)