根据速度或其他变量向左、向右、向上或向下滑动

5
我有一个从SimpleOnGesture类继承而来的类,并且正在使用onFling方法:
class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        float e1_X = e1.getX();
        float e1_Y = e1.getY();
        float e2_X = e1.getX();
        float e2_Y = e2.getY();
        if(velocityX > 0 && velocityX > velocityY){
            text.setText("Swipe left");
        }else if(velocityX < 0 && velocityX < velocityY){
            text.setText("Swipe right");
        }else if(velocityY < 0 && velocityX > velocityY){
            text.setText("Swipe down");
        }else if(velocityY > 0 && velocityX < velocityY){
            text.setText("Swipe up");
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }
}

我知道这取决于某些角度,但我做不到,我尝试过使用velocityX和velocityY,只有当您精确地执行时才有效。但我想要的是一个“错误”的角度:例如,如果您斜向滑动,比如向上和向右,我需要选择哪个是正确的方向。

1个回答

4

你需要检查速度和距离。这里是一个水平滑动检测器的示例。您可以以同样的方式添加垂直检测。

public class HSwipeDetector extends SimpleOnGestureListener {
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    @Override
    public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {  return false;  }

        /* positive value means right to left direction */
        final float distance = e1.getX() - e2.getX();
        final boolean enoughSpeed = Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY;
        if(distance > SWIPE_MIN_DISTANCE && enoughSpeed) {
            // right to left swipe
            onSwipeLeft();
            return true;
        }  else if (distance < -SWIPE_MIN_DISTANCE && enoughSpeed) {
            // left to right swipe
            onSwipeRight();
            return true;
        } else {
            // oooou, it didn't qualify; do nothing
            return false;
        }
    }

    protected void onSwipeLeft() { 
        // do your stuff here
    }

    protected void onSwipeRight() {   
        // do your stuff here
    }
}

是的,我知道,但我希望在加入那些条件之前可以上下滑动。它确实对我有帮助,但这不是我要找的答案。 - Tsunaze
在对角线滑动的情况下,比较VelocityX和VelocityY与比较distanceX和distanceY是相同的(因为速度是由距离导出的)。速度是滑动移动的能量度量。为了完成您的任务,您需要分析距离,并仅将速度用作阈值,以查看用户的移动是否足够快以符合滑动的要求。 - JBM
好的,我需要使用的是SWIPE_MAX_OFF_PATH。这个变量用于判断用户是垂直滑动还是水平滑动。我在这个链接上找到了一些东西。 - Tsunaze
@JBM:你能告诉我如何计算“SWIPE_THRESHOLD_VELOCITY”值吗? - Mani
1
只需找出最适合您的价值。在我的情况下是200。在您的情况下,根据所需响应级别可以更少或更多。尝试自己找到最适合的值。顺便提一下,建议在计算之前将像素转换为dip。这将使其在具有不同密度的不同屏幕上保持稳定。 - JBM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接