我正在尝试使用以下方法在Android中模拟向右滑动手势:
private void addGestures () {
final int[] x1 = {0};
final int[] x2 = {0};
final int[] y1 = {0};
final int[] y2 = {0};
final int[] t1 = {0};
final int[] t2 = {0};
View myView = findViewById(R.id.detail_activity);
myView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1[0] = (int)event.getX();
y1[0] = (int) event.getY();
t1[0] = (int) System.currentTimeMillis();
return true;
case MotionEvent.ACTION_UP:
x2[0] = (int) event.getX();
y2[0] = (int) event.getY();
t2[0] = (int) System.currentTimeMillis();
if (x2[0] > x1[0]) {
onBackPressed();
}
return true;
case MotionEvent.ACTION_MOVE:
return true;
}
return false;
}
});
}
问题在于,现在,只要我触摸屏幕,它就会被识别为手势,并且调用了onBackPressed方法。我添加了第三个变量来检查用户触摸屏幕所需的时间。如何实现它们以识别划动?
答案 0 :(得分:2)
忘记所做的事。
将此侦听器添加到您的项目中:
package com.example.testproject.listeners;
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 {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
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)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
result = true;
}
}
else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeRight() {
//Called when swiping right to all views that implement the listener
}
public void onSwipeLeft() {
//Called when swiping left to all views that implement the listener
}
public void onSwipeTop() {
//Called when swiping top to all views that implement the listener
}
public void onSwipeBottom() {
//Called when swiping bottom to all views that implement the listener
}
}
然后实施:
yourView.setOnTouchListener(new OnSwipeTouchListener(this) {
public void onSwipeTop() {
//Called when swiping top on this view
}
public void onSwipeRight() {
//Called when swiping right on this view
}
public void onSwipeLeft() {
//Called when swiping left on this view
}
public void onSwipeBottom() {
//Called when swiping bottom on this view
}
});
这是一个很棒的模块化解决方案! 如果您需要根据自己的喜好调整滑动手势,请更改
的值private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
在侦听器中。