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事件的分发,且可据此在今后根据需要做相关的定制了。上一篇博客所写的每一个点都已被验证。写完这两篇,不论好坏,自己对事件分发的了解也透彻多了。
0 0
原创粉丝点击