android事件分发全测试

前言

本文是对上篇博客的例程验证。
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值