如何使onTouch像Android中的onTap一样工作?

时间:2012-09-27 09:19:32

标签: android android-layout android-button

我在MapActivity中实现了OnTouchListener,当然我必须覆盖onTouch()方法。

我希望它只在我点击地图时触发 - 否则我甚至无法移动地图。

这是我的onTouch方法:

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

    if (e.getAction() == MotionEvent.ACTION_DOWN) {

      // SOME ACTIONS ...

    }
    return true;
}

3 个答案:

答案 0 :(得分:0)

使用:

e.getAction() == MotionEvent.ACTION_UP

e.getAction() == MotionEvent.ACTION_MOVE

如果在和ACTION_DOWN之后有ACTION_UP事件,并且之间没有ACTION_MOVE,则点击

更新:

private int mLastMotionEventAction = MotionEvent.ACTION_UP;

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

    if (e.getAction() == MotionEvent.ACTION_DOWN) {


      // SOME DOWN ACTIONS ...

    } else if (e.getAction() == MotionEvent.ACTION_MOVE) {

      // SOME MOVE ACTIONS ...

    } else if (e.getAction() == MotionEvent.ACTION_UP) {
       if (mLastMotionEventAction == MotionEvent.ACTION_DOWN){

         // SOME TAP ACTIONS ...

       }
    }
    mLastMotionEventAction = e.getAction();
    return true;
}

另一种选择(针对敏感设备):

    private long mLastDownEventTime = 0;

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

        if (e.getAction() == MotionEvent.ACTION_DOWN) {
           mLastDownEventTime = System.currentTimeMillis();

          // SOME DOWN ACTIONS ...

        } else if (e.getAction() == MotionEvent.ACTION_MOVE) {

          // SOME MOVE ACTIONS ...

        } else if (e.getAction() == MotionEvent.ACTION_UP) {
           if (System.currentTimeMillis() - mLastDownEventTime < 500){

             // SOME TAP ACTIONS ...

           }
        }

        return true;
    }

仅当自上次向下按下200ms或更短时间后才会触发点击操作。当然,您可以更改最佳用户体验的时间。

答案 1 :(得分:0)

如果您想将事件传递到地图,则必须返回false。否则,如您所述,地图不会对触摸手势做出反应。这是因为,返回true表示您消费事件。

答案 2 :(得分:0)

我知道这是一个老问题,但正确的做法是使用getScaledTouchSlop(),它会在我们认为用户滚动之前返回触摸可以徘徊的距离。

在onTouch方法中实现它:

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

        int mSwipeSlop = ViewConfiguration.get(context).
                    getScaledTouchSlop();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // DO
            break;
        case MotionEvent.ACTION_CANCEL:
            // DO
            break;
        case MotionEvent.ACTION_MOVE:
            {
                float x = event.getX() + v.getTranslationX();
                float deltaX = x - mDownX;
                float deltaXAbs = Math.abs(deltaX);
                float y = event.getY() + v.getTranslationY();
                float deltaY = Y - mDownY;
                float deltaYAbs = Math.abs(deltaY);
                float absDist = Math.sqrt(Math.pow(deltaXAbs, 2) + Math.pow(deltaXAbs, 2));
                if (!mSwiping) {
                    if (absDist > mSwipeSlop) {
                        mSwiping = true;
                    }
                }
            break;
        case MotionEvent.ACTION_UP:
            {
                if (mSwiping) {
                    // DO MOVE ACTIONS
                }
                else {
               // DO TAP ACTIONS
                }
            }
            break;
        default: 
            return false;
        }
        return true;
    };

开发者页面:http://developer.android.com/reference/android/view/ViewConfiguration.html#getScaledTouchSlop()