Я подготовил для вас 2 общих класса «копировать и вставить», чтобы вы могли очень легко использовать все жесты в RecyclerView.
1 - GestureDetector - просто добавьте его в свой проект
class OnSwipeTouchListener implements View.OnTouchListener {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener(Context ctx, TouchListener touchListener) {
gestureDetector = new GestureDetector(ctx, new GestureListener(touchListener));
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 300;
private static final int SWIPE_VELOCITY_THRESHOLD = 300;
private TouchListener touchListener;
GestureListener(TouchListener touchListener) {
super();
this.touchListener = touchListener;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("TAG", "onSingleTapConfirmed:");
touchListener.onSingleTap();
return true;
}
@Override
public void onLongPress(MotionEvent e) {
Log.i("TAG", "onLongPress:");
touchListener.onLongPress();
}
@Override
public boolean onDoubleTap(MotionEvent e) {
touchListener.onDoubleTap();
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) {
touchListener.onSwipeRight();
} else {
touchListener.onSwipeLeft();
}
result = true;
}
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
touchListener.onSwipeDown();
} else {
touchListener.onSwipeUp();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
}
2 - TouchListener - просто добавьте определение интерфейса в свой проект.Чтобы сделать использование еще проще, я использовал некоторые реализации интерфейса по умолчанию.Итак, вам нужно добавить в build.gradle вашего модуля:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Добавить интерфейс:
public interface TouchListener {
void onSingleTap();
default void onDoubleTap() {
Log.i("TAG", "Double tap");
}
default void onLongPress() {
Log.i("TAG", "Long press");
}
default void onSwipeLeft() {
Log.i("TAG", "Swipe left");
}
default void onSwipeRight() {
Log.i("TAG", "Swipe right");
}
default void onSwipeUp() {
Log.i("TAG", "Swipe up");
}
default void onSwipeDown() {
Log.i("TAG", "Swipe down");
}
}
3 - Теперь вы можете присоединить к любому представлению TouchListener и реализовать только теметоды, которые вам действительно нужны.Пример:
holder.anyview.setOnTouchListener(new OnSwipeTouchListener(mCtx, new TouchListener() {
@Override
public void onSingleTap() {
Log.i("TAG", ">> Single tap");
}
@Override
public void onDoubleTap() {
Log.i("TAG", ">> Double tap");
}
@Override
public void onLongPress() {
Log.i("TAG", ">> "Long press");
}
@Override
public void onSwipeLeft() {
Log.i("TAG", ">> Swipe left");
}
@Override
public void onSwipeRight() {
Log.i("TAG", ">> Swipe right");
}
}));
Вот и все!Наслаждаться.