package de.avalax.fitbuddy.presentation.workout.swipe_bar; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; public abstract class SwipeBarOnGestureListener extends GestureDetector.SimpleOnGestureListener { private View view; private int maxIncrement; private int minDistance; private int velocity; public SwipeBarOnGestureListener(int maxIncrement, View view, int minDistance, int velocity) { this.maxIncrement = maxIncrement; this.view = view; this.minDistance = minDistance; this.velocity = velocity; } @Override public boolean onSingleTapUp(MotionEvent e) { onFlingEvent(1); return true; } @Override public boolean onFling(MotionEvent startEvent, MotionEvent endEvent, float x, float y) { float absY = Math.abs(y); float distance = startEvent.getY() - endEvent.getY(); int scaledBarHeight = view.getHeight() / 2; if (distance > minDistance && absY > velocity) { onFlingEvent(calculateMoved(distance, scaledBarHeight)); return true; } else if (-distance > minDistance && absY > minDistance) { onFlingEvent(-calculateMoved(distance, scaledBarHeight)); return true; } return false; } private int calculateMoved(float moved, int height) { if (Math.abs(moved) + minDistance >= height) { return maxIncrement; } return 1; } public abstract void onFlingEvent(int moved); }