我有这个代码。有用。我可以向左和向右滑动以获得所需的结果。但是,问题是我必须几乎严格地水平滑动才能使滑动动作起作用。我想在刷卡时有更多的自由。当我斜向滑动时,我希望滑动也能正常工作。我该如何更改此代码?
这是代码
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class OnSwipeTouchListener implements OnTouchListener {
Context context = null;
private final GestureDetector gestureDetector = new GestureDetector(context, new GestureListener());
public boolean onTouch(final View view, final MotionEvent motionEvent) {
return gestureDetector.onTouchEvent(motionEvent);
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY) - 50) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
答案 0 :(得分:0)
if (Math.abs(diffX) > Math.abs(diffY) - 50)
条件确定它是水平滑动还是垂直滑动。您可以做的第一件事是将50
密度相关,乘以DisplayMetrics.density
。
如果这不会产生您正在寻找的结果,请考虑使用三角法来确定起点和终点之间的角度。考虑从e1
到e2
的向量,找到它与x
轴之间的角度。它应该是arccos(diffX/sqrt(diffX*diffX + diffY*diffY))
(弄清楚如何让它在所有4个象限中都可以作为读者练习)。
通过将该角度与特定的度数范围(例如右滑动为-45到45)进行比较,您可以获得更加直观和可自定义的结果。
请注意,这只考虑方向而非速度。