Android事件分发机制

我们在MainActivity中注册一个Button按钮,分别为它设置onClick和onTouch事件

        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.dispatch_button);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.v("TAG", "onClick");
            }
        });
        button.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                Log.v("TAG", String.valueOf(event.getAction()));
                return false;
            }
        });
    }

   onTouch事件会比onClick更优先执行,而且只有onTouch返回false的时候,onClick才会被执行,原因是,view在被点击后,都会调用dispatchTouchEvent方法,

        if (onFilterTouchEventForSecurity(event)) {
            //noinspection SimplifiableIfStatement
            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
            }

            if (!result && onTouchEvent(event)) {
                result = true;
            }
        }

回调onTouch方法以后,如果返回true,那么onTouchEvent将不会被执行,其内部包含了第一个监听器的onClick方法,直接会被忽略不执行,该按钮被按下后,ACTION_DOWN,ACTION_UP,ACTION_MOVE会被反复执行,也即事件会被反复分发,这里为什么每次onTouchEvent被执行,onClick却只被执行一次,原因是onTouchEvent方法中会判断是ACTION_DOWN,ACTION_UP,,只有ACTION_UP中才执行了performClick方法,该方法执行了clickListener中的onClick方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值