android事件分发全测试
来源:互联网 发布:外贸数据 编辑:程序博客网 时间:2024/05/15 11:10
前言
本文是对上篇博客的例程验证。http://blog.csdn.net/ohradiance/article/details/52914144
测试场景:一个Viewgroup中包含了一个Button。
以下为各类情况下的测试结果,用以验证之前所述的android事件分发机制。
View内部的测试
情景1
同一个View内部OnTouchListener和OnClickListener等的优先级。
1) 同时注册OnTouchListener和OnClickListener
btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("info", "btn onTouch."); return true; } });// btn.setClickable(false); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("info", "btn OnClickListener."); } });
测试结果:
10-25 13:24:31.316 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.336 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.346 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.366 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.386 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.396 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:24:31.396 14591-14591/com.bailiwuyi.test D/info: btn onTouch.
2)
btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("info", "btn onTouch."); return false; } });// btn.setClickable(false); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("info", "btn OnClickListener."); } });
10-25 13:27:20.676 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.706 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.716 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.736 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.746 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.756 21357-21357/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:27:20.766 21357-21357/com.bailiwuyi.test D/info: btn OnClickListener.
结论:OnTouchListener的返回值决定了onTouchEvent是否被调用,也就影响了OnClickListener等的被调用。
情景2
Viewgroup和View之间的事件分发。
1)为Button和Viewgroup都注册OnClickListener
viewGroup.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("info", "viewGroup onTouch."); return false; } }); viewGroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("info", "viewGroup OnClickListener."); } });
点击Button:
10-25 13:35:36.766 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.786 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.806 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.816 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.826 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.826 27014-27014/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:35:36.836 27014-27014/com.bailiwuyi.test D/info: btn OnClickListener.
点击空白的地方:
10-25 13:33:25.316 27014-27014/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:33:25.336 27014-27014/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:33:25.356 27014-27014/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:33:25.366 27014-27014/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:33:25.376 27014-27014/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:33:25.396 27014-27014/com.bailiwuyi.test D/info: viewGroup OnClickListener.
结论:点击button时,事件被button处理,viewgroup不会再处理本次事件。
2)仅为Viewgroup注册OnClickListener,Button不注册。
点击button:
什么都木有
点击空白地方:
10-25 13:40:27.056 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:40:27.076 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:40:27.076 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:40:27.096 5866-5866/com.bailiwuyi.test D/info: viewGroup OnClickListener.
结论:在没有关闭button的Clickable时,即便是没有注册OnClickListener,也会被默认处理了该次事件,Viewgroup依然收不到。
3)为Viewgroup注册OnClickListener且关闭button的Clickable
btn.setClickable(false);// btn.setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {// Log.d("info", "btn OnClickListener.");// }// });
PS:为button注册OnClickListener会默认打开Clickable的。
点击buttong:
10-25 13:44:18.386 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:18.406 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:18.416 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:18.436 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:18.436 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:18.456 5866-5866/com.bailiwuyi.test D/info: viewGroup OnClickListener.
点击空白地方:
10-25 13:44:26.486 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:26.506 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:26.516 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:26.526 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:26.526 5866-5866/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:44:26.546 5866-5866/com.bailiwuyi.test D/info: viewGroup OnClickListener.
结论:关闭Clickablebutton就不处理事件了,然后么就只好Viewgroup来处理了。
4)如果一开始就拒收起始事件的话
viewGroup = (RelativeLayout) findViewById(R.id.actMainContent); viewGroup.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("info", "viewGroup onTouch."); return false; } }); viewGroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("info", "viewGroup OnClickListener."); } }); btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("info", "btn onTouch."); return false; } }); btn.setClickable(false);
PS:看了上面一条,你就该明白为什么一定要关闭button的Clickable。
点击button:
10-25 13:49:43.236 22073-22073/com.bailiwuyi.test D/info: btn onTouch.
10-25 13:49:43.236 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.246 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.266 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.286 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.296 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.306 22073-22073/com.bailiwuyi.test D/info: viewGroup onTouch.
10-25 13:49:43.316 22073-22073/com.bailiwuyi.test D/info: viewGroup OnClickListener.
结论:拒绝起始事件,后续事件将由Viewgroup处理。呼应了上面第3)条。
总结
聪敏的你应该已经明白touch事件的分发,且可据此在今后根据需要做相关的定制了。上一篇博客所写的每一个点都已被验证。写完这两篇,不论好坏,自己对事件分发的了解也透彻多了。
- android事件分发全测试
- 测试android事件分发
- Android 事件分发测试
- Android 事件分发机制测试以及总结
- android-----事件分发机制测试系列
- android-----事件分发机制测试系列(二)
- android-----事件分发机制测试系列(三)
- android-----事件分发机制测试系列(四)
- android-----事件分发机制测试系列(五)
- Android事件分发机制(Demo测试)
- Android事件分发、View事件Listener全解析
- Android事件分发、View事件Listener全解析
- Android中Touch事件分发过程全解析
- Android事件分发机制完全解析(全)
- 读Android源码之事件分发机制最全总结
- 读Android源码之事件分发机制最全总结
- android-----关于事件分发机制中几点困惑测试
- Android学习之路---点击事件的分发测试
- 【2016.10.25导航】鼠标经过导航出现副导航的js
- 神经网络二:浅谈反向传播算法(backpropagation algorithm)为什么会很快
- 什么是DCI? 它有什么用?
- zabbix+微信+短信+邮件+客户端告警机制:安装包方式和源码安装
- 在 2016 年学 Android 是一种什么样的体验?
- android事件分发全测试
- java连接mysql
- CCF 201312-3 最大的矩形
- 第8周拓展实践 3.换分币
- 穷举法和回溯法解n皇后问题
- sql server如何轻松简单的构建备份表
- 欢迎使用CSDN-markdown编辑器
- ubuntu 16.04 php7 开启错误显示
- JDK1.5新特性--内省(Introspector)