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

作者: 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