【问题标题】:Can I prevent onFling() and onDown() from both firing?我可以防止 onFling() 和 onDown() 都触发吗?
【发布时间】:2019-09-27 12:15:34
【问题描述】:

我检测 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;
}

然而这并没有奏效。这是无法避免的事情吗?

我知道,要执行“甩动”动作,您必须先将手指放下……但我希望有一种方法可以仔细检查用户的手指是否向下移动(滑动/fling)。

提前致谢!

【问题讨论】:

    标签: android gesture gesturedetector


    【解决方案1】:

    使用 onSingleTapUp 和 onDoubleTap replce onDown。

    我觉得可以避免触发onFling。

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 2011-07-09
      • 2013-02-07
      • 1970-01-01
      • 2011-02-24
      • 2012-04-02
      • 1970-01-01
      • 2010-12-23
      相关资源
      最近更新 更多