[英]How to make the swipe left/right gestures more free?
我有這個代碼。 有用。 我可以左右滑動以取得所需的結果。 但是,問題是我必須嚴格地水平滑動才能使滑動動作起作用。 滑動時我希望有更多的自由。 我希望對角滑動時滑動也能起作用。 我應該如何更改此代碼?
這是代碼
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;
}
}
if (Math.abs(diffX) > Math.abs(diffY) - 50)
條件確定是水平滑動還是垂直滑動。 您可以做的第一件事是,將其乘以DisplayMetrics.density
使密度依賴於50
。
如果那不能產生您想要的結果,請考慮使用三角函數確定起點和終點之間的角度。 考慮從e1
到e2
的向量,並找到它與x
軸之間的角度。 它應該是arccos(diffX/sqrt(diffX*diffX + diffY*diffY))
(為讀者練習如何使它在所有四個象限中起作用)。
通過將該角度與特定的度數范圍(例如,向右滑動為-45到45度)進行比較,您可以獲得更加直觀和可自定義的結果。
請注意,這僅考慮方向,而不考慮速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.