onTouch返回true和false的区别,如何解决onTouch和onClick冲突


在开发中,我们会遇到某个图标可拖动的需求,我们会同时使用到onClick和onTouch事件,这个时候onClick和onTouch会发生冲突。
1、我们先比较他们 onClick和onTouch 的用法,从下面代码可以发现,onTouch有返回,而onClick无返回。这个时候你会好奇,返回true和false有什么区别?下面来分析有什么不同和区别。
mIvSendCash.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View vMotionEvent event) {
        return false;
    }
});
mIvSendCash.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    }
});

onTouch监听返回false和ture,主要有两种情况:
第一种情况:单独使用setOnTouchListener
第二种情况: setOnTouchListener和setOnclickListener一起使用(不建议一起使用,可以将点击事件放在up中)
在比较上面这两种情况之前,我需要先讲解另一个知识点:Android的触摸事件。
Android 的触摸事件分为两类:1、down - up      2、down-move-up  ,所谓的down就是按下手指,move就是移动手指,up就是松开手指
我们使用手机,每次点击屏幕的时候,都会触发这两种事件之一:1、按下手指 ,然后松开手指   2、按下手指,移动,然后松开手指。这个是时候我们就可以解释一件事了,平时我们点击某个按钮,必须是松开手指才会跳转,并且在此期间,你手指滑动到按钮外,也不会触发点击事件。

Android中把触摸事件封装成了一个类MotionEvent,用户的一次点击、触摸或者滑动都会产生一系列的MotionEvent
这个类的内容很简单,就两个东西:事件类型+坐标xy
事件类型有四种
MotionEvent.ACTION_DOWN 表示用户的手指刚接触到屏幕
MotionEvent.ACTION_MOVE 表示用户的手指正在移动
MotionEvent.ACTION_UP 表示用户的手指从屏幕上抬起
Cancel


2、讲解完事件机制,正式说明onTouch返回ture和false的区别:
首先分析第一种情况,单独使用setOnTouchListener,无setOnclickListener
        mCustomerServiceSpace.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View vMotionEvent event) {
                switch (event.getAction()) {
                   case MotionEvent.ACTION_DOWN:
                       LogUtils.e("ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        LogUtils.e("ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP:
                        LogUtils.e("ACTION_UP");
                        break;
                }
                return false;
            }
        });
onTouch为false的日志执行情况

onTouch为true的日志执行情况:

通过日志发现,为false的时候,只会执行down方法,不会执行move和up. 只有在true的时候,三个都会执行。

第二种情况:setOnTouchListener和setOnclickListener一起使用(不建议)

当setOnTouchListener和setOnclickListener一起使用,onTouch为true,则不会执行onClick方法,为false的才会执行onClick方法。无论是true还是false,down,move,up这三个方法都会执行


综合以上,解决onClick和onTouch冲突,在setOnTouchListenenr中返回true,并将点击事件放在up方法中。监测move事件,判断是否发生x或y轴的位移,用weatherMove记录状态,在up方法中weatherMove为false的时候执行onclick方法


  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值