我可以防止onFling()和onDown()同时触发吗?

时间:2019-05-09 15:44:38

标签: android gesture gesturedetector

我同时出于两个不同的目的检测了onDown()和onFling()手势,两者均有效。

在onDown()内将播放声音,而在onFling()期间检测到滑动并采取了与滑动相关的动作-在onFling()手势期间不应播放声音。

问题是当我执行滑动动作或onFling()被触发时,会触发onDown()声音。

我当前的onDown()手势如下:

@Override
public boolean onDown(MotionEvent e) {

    playSound();

    return true;
}

我的onFling()看起来像:

@Override
public boolean onFling(MotionEvent downEvent, MotionEvent moveEvent, float velocityX, float velocityY) {
    boolean result = false;

    float diffY = moveEvent.getY() - downEvent.getY();
    float diffX = moveEvent.getX() - downEvent.getX();

    // which was greater? movement across Y or X
    if( Math.abs(diffX) > Math.abs(diffY) ) {

        // right or left swipe
        if( Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {

            doSomethingCool();

            result = true;

        }
    } else {
        // up or down swipe
        if( Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {

            doSomethingCool();

            result = true;
        }
    }

    return result;
}

我已经检查了GestureDetector类,看onDown()是否可以有多个参数,例如onDown(MotionEvent downEvent, MotionEvent moveEvent),但这是不可能的。

我尝试在onDown()中使用MotionEvent常量(ACTION_DOWN和ACTION_MOVE)来消除划动/滑动:

@Override
public boolean onDown(MotionEvent e) {

    if(e.getAction() == e.ACTION_DOWN) {
        playSound();
        return true;
    }

    return false;
}

但是那没有用。这是不可避免的吗?

我了解到,要执行“跳跃”动作,您必须先将手指放下……但我希望有一种方法可以再次检查用户的手指是否向下而实际上并未运动(滑动/ finging)。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用onSingleTapUp和onDoubleTap代替onDown。

我认为它可以避免触发onFling。