Android 一次点击动作的分析
来源:互联网 发布:手机信号网络差的原因 编辑:程序博客网 时间:2024/05/30 23:28
Android一次点击动作的分析
android中的事件类型分为按键事件和屏幕触摸事件,
Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
下面就以一个点击动作为例,来分析一下Android系统的事件传递和处理.
先说明一下,绿色是自定义的控件(TestView),继承自TextView, 红色也是自定义控件(TestLayout),继承自linearLayout,最下面的是Activity的布局文件.
我们将一个点击动作简单的分解为Down事件和Up事件.当点击屏幕的时候,Down事件会先发生,此时会被android系统监听到.
1传递事件
当系统监听到Down事件时,首先是调用事件分发函数.就是dispatchTouchEvent,调用顺序是
Activity.dispatchTouchEvent()-->TestLayout.dispatchTouchEvent()-->TestView.dispatchTouchEvent().
将Down事件从Activity传递到最上面的TestView.也就是说.事件的传递是从下面向上面传递.
2处理事件
当最上面的TestView控件收到这个Down事件的时候,它有两个选择.一个选择是处理这个Down事件,另一个选择当然就是不处理该事件.如果最上面的这个TestView选择处理这个Down事件,那就是说在TestView的onTouchEvent函数的Action_down分支里面返回true,
那就是说现在这个Down事件被TestView控件消耗掉了.之后处于TestView下面的TestLayout和最下面的Activiyt就没机会处理这一次点击所产生的Down事件了.此时Down事件就结束了.如果TestView选择不处理这个Down事件,就是说TestView的onTouchEvent函数的Action_down分支里面返回false,(或者选择默认),ok,这个时候Down事件会继续向下去找TestLayout.同时Down事件也做了一个艰难的决定,之后所有的事件,包括Move事件,Up事件都不会再传递给最上面的TestView控件了.因为你TestView都不甩我Down事件,那我之后的事件也不去找你TestView控件
现在Down事件来到了TestLayout控件哪里,TestLayout也有两个选择.要么处理.要么不处理.处理了Down事件就不在向下传,不处理那以后其他的事件也没有TestLayout什么事.
最后Down事件就这样从Activity被dispatch上来,从最上面开始寻找处理它的地方.找到了就处理完结束.如果从最上面的控件一路下来,都没人处理Down事件,那Down事件最后还是会回到Activity哪里.如果回到Activity这,那Activity肯定会处理,(因为最开始也从Activity这里送出去的, 呵呵)
ok,Down事件完了,那就该Up事件出场了.Up事件的传递是根据前面Down事件的处理情况来决定的.Up事件只会被传递到Down事件被处理的控件上去.比如说.前面Down事件如果被TestView这个控件处理的话,那Up事件也会被送到TestView这个控件上的.Up事件送到TestView控件之后,TestView也有两个选择,要么处理,要么不处理.如果TestView控件处理了这个Up事件,也就是说TestView的onTouchEvent函数的Action_Up分支里面返回true,那该Up事件就结束了.如果TestView控件不处理这个Up事件,Up事件就只好再向下去找TestLayout控件.那TestLayout控件也有两个选择,以此类推,如果都不处理,那最后就只能右Activity处理了.
这就是Activity系统的一次点击动作所发生的事情.如果我们的自定义控件实现了onTouchEvent()方法.如果想在Action_Up分支中实现有关的逻辑处理,那我们的Action_Down分支就必须返回true,表示我会招待好Down事件,希望Down事件不要生气,将以后的事件(Move Up)也都给我传上来.
- Android 一次点击动作的分析
- QT creator源码分析 ----点击search后的动作
- android 按钮只能点击一次
- 一次android错误日志的分析问题
- 模拟Radio Button的点击动作
- OpenERP 点击菜单的背后动作
- js 屏蔽object标签的点击动作
- android view 屏幕的点击位置分析
- Android Toast连续点击只弹一次
- Android--Toast多次点击只显示一次
- android uiautomator 点击分析
- 一次死锁的分析
- 证明加载类的动作仅发生一次
- leetcode:Keyboard Row 把重复的动作,一次循环完成!
- 关于前端跨域 一次动作 两次请求的问题
- 一次Android游戏黑屏闪退问题的分析
- 一次app抓包引发的Android分析记录
- 一次app抓包引发的Android分析记录
- 行人属性“Attributed Grammars for Joint Estimation of Human Attributes, Part and Pose”
- ORACLE-SQL积累(查询外检约束、记录长度、字段长度、启用禁用触发器、case用法、分组连接函数、查询被锁表)
- SpringMVC用MultipartFile上传文件及文件名中文乱码
- 类型转换
- virtualbox下最小化安装centos7后上网设置
- Android 一次点击动作的分析
- ios 调用系统的地图
- 数据结构实验之串一:KMP简单应用
- 在uboot中使用UDP协议实现UDP通信
- JSP/Servlet 工作原理(转载)
- 架构和处理模型
- kafka topic手动删除及其他相关
- RequestMapping定义只能为字母
- 网络编程