没有合适的资源?快使用搜索试试~ 我知道了~
Android源码分析——ViewGroup的事件分发机制(二)
0 下载量 195 浏览量
2021-01-03
18:23:30
上传
评论
收藏 659KB PDF 举报
温馨提示
通过前一篇博客View的事件分发机制,从dispatchTouchEvent说起(一)的介绍相信大家对 Android View 事件的分发机制有了很深的理解。我们知道 Android 中 View 是存在于 Activity。 今天我们继续学习 Activity 到 ViewGroup 的事件分发机制。 一、Activity 分发到 ViewGroup 当我们手指触摸到屏幕时,最先接收到事件的肯定是Activity,首先调用的是Activity的dispatchTouchEvent(event),那么我们下面先来看它的源码: 1、dispatchTouchEvent(event) publi
资源推荐
资源详情
资源评论
Android源码分析源码分析——ViewGroup的事件分发机制(二)的事件分发机制(二)
通过前一篇博客View的事件分发机制,从dispatchTouchEvent说起(一)的介绍相信大家对 Android View 事件的分发机制有了很深的理解。我们知道 Android 中 View 是存在于
Activity。 今天我们继续学习 Activity 到 ViewGroup 的事件分发机制。
一、一、Activity 分发到分发到 ViewGroup
当我们手指触摸到屏幕时,最先接收到事件的肯定是Activity,首先调用的是Activity的dispatchTouchEvent(event),那么我们下面先来看它的源码:
1、、dispatchTouchEvent(event)
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
这里我们看到首先它判断了是不是 DOWN 事件,如果是的话调用了onUserInteraction()这个方法我们看到在Activity源码中是空的,它可以让子类去实现。我们这里不需要多做关注。
下面我们发现这里它继续调用了getWindow().superDispatchTouchEvent(ev),这里我们后面再讲。我们看到如果前面返回时false的话,后面调用了Activity的onTouchEvent(ev)。
那么我们继续看getWindow().superDispatchTouchEvent(ev),这里我们之前文章提到过,getWindow()返回的是 PhoneWindow 对象,那么我们继续看PhoneWindow,我们会发现它调用
了mDecor.superDispatchTouchEvent(event),也就是执行到 DecorView 的superDispatchTouchEvent(event)。我们继续追踪发现,最终掉的是 ViewGroup 的 diapatchTouchEvent(event)方法。
那我们这里先总结下dispatchTouchEvent:
Activity==>PhoneWindow==>DecorView==>ViewGroup
2、、onTouchEvent(event)
上面的具体到 ViewGroup 我们后面再看,这里我们还是回到之前的如果返回false那么就需要调用Activity.onTouchEvent(ev),那么它的源码如下:
public boolean onTouchEvent(MotionEvent event) {
if (mWindow.shouldCloseOnTouch(this, event)) {
finish();
return true;
}
return false;
}
这里只是判断了点击事件的边界条件,如果在边界内就直接返回了false,否则finish当前 Activity。
二、二、ViewGroup 的分发的分发
我们上面看到Activity.dispatchTouchEvent(ev)最终调用到ViewGroup.diapstchTouchEvent(ev)那么下面我们继续看下它的源码:
1、、ViewGroup.dispatchTouchEvent(ev)
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
/*****************省略部分非核心代码***********************/
//标记事件是否被处理
boolean handled = false;
//判断当前窗口是不是模糊窗口如果是则拦截掉,不是则继续分发
if (onFilterTouchEventForSecurity(ev)) {
final int action = ev.getAction();
final int actionMasked = action & MotionEvent.ACTION_MASK;
// 初始化DOWN事件
if (actionMasked == MotionEvent.ACTION_DOWN) {
cancelAndClearTouchTargets(ev);
resetTouchState();
}
// 检查是否拦截该事件
final boolean intercepted;
if (actionMasked == MotionEvent.ACTION_DOWN
|| mFirstTouchTarget != null) {
//判断是否可以被拦截
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
if (!disallowIntercept) {
intercepted = onInterceptTouchEvent(ev);//判断是否拦截该事件
ev.setAction(action); // restore action in case it was changed
} else {
intercepted = false;
}
} else {
intercepted = true;
}
/*****************省略部分非核心代码***********************/
//检查是否取消
final boolean canceled = resetCancelNextUpFlag(this)
|| actionMasked == MotionEvent.ACTION_CANCEL;
资源评论
weixin_38673694
- 粉丝: 3
- 资源: 949
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OpenCV计算机视觉项目实战 - 目标追踪(基于Python + OpenCV)
- 2017年毕业设计.zip
- 智能菜谱推荐系统借助 SpringBoot 腾飞:代码影响力与美食推广
- Unity 与 CryEngine优缺点对比
- 1、使用Redis存储AccessToken 2、使用MySQL存储ClientDetails和UserDetails信息.zip
- 电线杆残旧检测3-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- 1412基于Python源码神经网络人脸识别疲劳检测与预警系统设计毕业案例设计.zip
- 学院个人信息管理系统的 SpringBoot 代码魔法演绎
- 物品检测10-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- 【Java从入门到放弃 之 从字节码的角度异常处理】文章中的字节码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功