您的位置:首页 > 产品设计 > UI/UE

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

2017-02-07 11:41 579 查看
在开发中,我们会遇到某个图标可拖动的需求,我们会同时使用到onClick和onTouch事件,这个时候onClick和onTouch会发生冲突。
1、我们先比较他们onClick和onTouch的用法,从下面代码可以发现,onTouch有返回,而onClick无返回。这个时候你会好奇,返回true和false有什么区别?下面来分析有什么不同和区别。

mIvSendCash.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        return false;
    }

});
mIvSendCash.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

    }

});

onTouch监听返回false和ture,主要有两种情况:
第一种情况:单独使用setOnTouchListener
第二种情况:se
4000
tOnTouchListener和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 v, MotionEvent 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方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐