触碰、点击、长按事件学习👋

作者: luckyyyyou | 来源:发表于2017-06-01 18:57 被阅读0次

因为最近项目中需要实现一个长按Button然后移动的功能,就花了点时间把包括触碰、点击和长按一系列手势事件看了一下。


1.触碰事件

代码片段

button.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View arg0, MotionEvent arg1) {
                if(arg1.getAction()==MotionEvent.ACTION_DOWN){
                    Log.i(TAG, "OnTouchListener    +    down");
                    return false;
                }else if(arg1.getAction()==MotionEvent.ACTION_UP){
                    Log.i(TAG, "OnTouchListener    +    up");
                    return false;
                }else {
                    Log.i(TAG, "OnTouchListener    +    move");
                    return false;
                }
            }
        });

Touch事件可分为三个过程:ACTION_DOWN、ACTION_MOVE、ACTION_UP,而ACTION_MOVE涉及到一系列关于坐标变化的问题,比如将一个Button或者一张图片进行移动,其实就是通过setX()和setY()对View的进行坐标的设定,具体的内容可以参照小Demo大知识-控制Button移动来学Android坐标

2.点击、长按事件

代码片段

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Log.i(TAG, "OnClickListener");
            }
        });

        button.setOnLongClickListener(new View.OnLongClickListener() {
            public boolean onLongClick(View arg0) {
                Log.i(TAG, "OnLongClickListener");
                return false;
            }
        });

由于涉及到的内容比较少,这里就把它们放在一起了。


下面重点对Touch事件的返回值return进行分析。
return值决定了在执行完Touch事件后是否继续响应短按或长按(也就是click或Longclick),return true则不执行,return false则继续等待响应,简而言之就是一旦return true那么点击(或长按)事件就无效了。

3.测试

3.1

            public boolean onTouch(View arg0, MotionEvent arg1) {
                if(arg1.getAction()==MotionEvent.ACTION_DOWN){
                    Log.i(TAG, "OnTouchListener + down");
                    return true;
                }else if(arg1.getAction()==MotionEvent.ACTION_UP){
                    Log.i(TAG, "OnTouchListener    +    up");
                    return false;
                }else {
                    Log.i(TAG, "OnTouchListener    +    move");
                    return false;
                }
            }

当ACTION_DOWN返回true时,表示对按下Button这个动作不响应,短按和长按都不响应:

I/MainActivity: OnTouchListener    +    down
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    up
I/MainActivity: OnTouchListener    +    down
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    up
I/MainActivity: OnTouchListener    +    down

可见只有Touch事件响应。

3.2

            public boolean onTouch(View arg0, MotionEvent arg1) {
                if(arg1.getAction()==MotionEvent.ACTION_DOWN){
                    Log.i(TAG, "OnTouchListener    +    down");
                    return false;
                }else if(arg1.getAction()==MotionEvent.ACTION_UP){
                    Log.i(TAG, "OnTouchListener    +    up");
                    return true;
                }else {
                    Log.i(TAG, "OnTouchListener    +    move");
                    return false;
                }
            }

当ACTION_UP返回true时,只有click事件不响应:

I/MainActivity: OnTouchListener    +    down
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    up
I/MainActivity: OnLongClickListener
I/MainActivity: OnTouchListener    +    down
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    up
I/MainActivity: OnLongClickListener

3.3

            public boolean onTouch(View arg0, MotionEvent arg1) {
                if(arg1.getAction()==MotionEvent.ACTION_DOWN){
                    Log.i(TAG, "OnTouchListener    +    down");
                    return false;
                }else if(arg1.getAction()==MotionEvent.ACTION_UP){
                    Log.i(TAG, "OnTouchListener    +    up");
                    return false;
                }else {
                    Log.i(TAG, "OnTouchListener    +    move");
                    return true;
                }
            }

当ACTION_MOVE返回true时,三个事件都能有响应。

I/MainActivity: OnTouchListener    +    down
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnLongClickListener
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    move
I/MainActivity: OnTouchListener    +    up
I/MainActivity: OnClickListener

相关文章

网友评论

    本文标题:触碰、点击、长按事件学习👋

    本文链接:https://www.haomeiwen.com/subject/swjefxtx.html