Android MotionEvent仅检测ACTION_MOVE

时间:2015-07-29 18:46:59

标签: android android-button multi-touch motion-detection motionevent

根据android MotionEvent文档:在按下手势期间(ACTION_DOWNACTION_UP之间)发生了更改。动作包含最近的点,以及自上次向下或移动事件以来的任何中间点。

ACTION_MOVE Android doc

所以,当我在我的观点上应用setOnTouchListene时,它完全有效,它会给我ACTION_DOWNACTION_UPACTION_MOVE

但我的问题是我只想在ACTION_DOWN之前完全忽略ACTION_MOVE个事件。因为ACTION_MOVE事件仅在ACTION_DOWN事件发生后才会发生。

我的编码:

      button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        Log.e("Mouse: ", "Click");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e("Mouse: ", "Move");
                        break;
                }

                return false;
            }
        });

因此,有任何理由忽略ACTION_DOWN事件。由于用户只想移动而不想点击,ACTION_MOVE也会在自己执行之前ACTION_DOWN出现。

...谢谢

1 个答案:

答案 0 :(得分:5)

根据你的评论 - 你可以玩反击。例如:

private static int counter = 0;
...  
button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {


            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    Log.e("Mouse: ", "Click");
                    break;
                case MotionEvent.ACTION_MOVE:
                    counter++; //check how long the button is pressed
                    if(counter>10){
                       Log.e("Mouse: ", "Move");
                    }

                    break;
                case MotionEvent.ACTION_UP:
                    if(counter<10){
                       //this is just onClick, handle it(10 is example, try different numbers)
                    }else{
                       //it's a move
                    }
                    counter = 0;
                    break;
            }

            return false;
        }
    });