下面是第一篇的连接

Android的ViewGroup中事件的传递机制(一)

关于onInterceptTouchEvent和onTouchEvent的详细解释。

 1 public class MainActivity extends Activity {
2 Group1 group1;
3 Group2 group2;
4 MyTextView myTv;
5
6 /** Called when the activity is first created. */
7 @Override
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10
11 //--group1
12 //----|
13 //-------group2
14 //---------|
15 //------------myTv
16
17 group1 = new Group1(this);
18 group2 = new Group2(this);
19 myTv = new MyTextView(this);
20 group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,
21 LayoutParams.FILL_PARENT));
22 group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,
23 LayoutParams.FILL_PARENT));
24 setContentView(group1);
25 }
26 }

分别重写Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重写MyTextView的onTouchEvent方法,最终得到的控件层次结构如下:

1.在默认返回值情况下logcat输出如下:

测试后可知默认情况下和所有方法返回值为false的结果一致,down事件的捕获顺序onInterceptTouchEvent先于onTouchEvent,由于onTouchEvent返回值为false,down事件没被消化,后续的move和up事件没有出现,同时逆序返回到父控件的onTouchEvent方法来捕获,如下图所示:

2.所有onTouchEvent返回值为true情况下logcat输出如下

输出结果可以看出子控件MyTextView消化了down事件,后续的move和up事件正常捕获,由于down事件被消化,上层的onTouchEvent方法不执行,如下图所示:(三箭头分别指down、move、up事件)

既然如此,如果MyTextView中onTouchEvent方法返回为false,而group1和group2的onTouchEvent方法返回true的结果自然也就如下图的顺序了:

测试输出结果证明了这一猜测顺序,

注意:可能有人对这种情况比较疑惑,ACTION_DOWN还好理解,但是ACTION_MOVE为什么没有经历myTv,而且ACTION_MOVE只经历了group1的onInterceptTouchEvent和group2的onTouchEvent而没有经历group2的onInterceptTouchEvent,我开始也费解,后来想想也是,大家对比第1条,由于onTouchEvent返回了false而没有消耗down事件导致后续的move和up都没有出现,这里也是一样由于myTv中的onTouchEvent返回了false也就是说没有消耗down事件,那么后面的move和up也都不会出现在这个view里面,但是group2截获到了down事件,但后来的move为什么group2中的onInterceptTouchEvent没有执行到呢,原因大家不要忘记了onInterceptTouchEvent的初衷是什么,返回false是让它的子view或viewgroup类处理,而group2的子控件显然是myTv而myTv的onTouchEvent返回了false也就是接收不到后续的move和up事件,也就没必要经过onInterceptTouchEvent来继续分发了(因为分发了也还是接收不到),经过group2的onTouchEvent因为它返回的是true,截获了事件并且消耗了事件。

3.当某个GroupView中的onInterceptTouchEvent方法返回值为true情况下logcat输出如下(如group2):

如果在该方法返回值中返回true,那么子控件将获取不到任何点击事件,转而向自身的onTouchEvent方法转发,如下图所示:

如果onTouchEvent方法返回值都为true,那么根据规律结果就如下图顺序触发:

最后logcat的结果证实了这一猜测,

根据这一顺序规律我们便可复写GroupView中的onInterceptTouchEvent来控制事件的响应者。

测试的demo:下载demo

[学习总结]4、Android的ViewGroup中事件的传递机制(一)

最新文章

  1. design pattern
  2. 十种MySQL报错注入
  3. CreateDIBSection函数
  4. oracle表分区心得
  5. Codeforces 612E - Square Root of Permutation
  6. Nginx反向代理匹配部分二级域名或二级目录配置
  7. mysql 初始化修改密码问题(Mac系统)
  8. Layoutparams理解
  9. 理解WebKit和Chromium: Chromium网络栈
  10. linux安装成功后怎么调出终端
  11. vue-cli按需加载,懒加载组件
  12. 使用OMS查询Api Management的调用日志
  13. Multi-pattern string match using Aho-Corasick
  14. 负载均衡----实现配置篇(Nginx)
  15. Flask应用错误处理
  16. 用python查看windows事件日志的方法(待后续研究)
  17. concurrent.futures模块 -----进程池 ---线程池 ---回调
  18. 解决wamp 3.0.6 访问路径出现 403 错误
  19. DDMS
  20. vi编辑器的命令详情

热门文章

  1. 使用ssh连接到centos7中docker容器
  2. 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)
  3. Ubuntu 安装 mysql 报错 "update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在"
  4. NodeJs创建一个简单的服务器
  5. 学习JS的第二天
  6. 一文看懂socket编程
  7. 8大原则带你秒懂Happens-Before原则
  8. QuantumTunnel:v1.0.0 正式版本发布
  9. Node http
  10. Scrapy入门到放弃05:让Item在Pipeline中飞一会儿