libpdfviewer/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java

64 lines
2.1 KiB
Java

package app.grapheneos.pdfviewer;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.ScaleGestureDetector;
import android.view.View;
/*
The GestureHelper present a simple gesture api for the PdfViewer
*/
class GestureHelper {
public interface GestureListener {
// Can be replaced with ratio when supported
void onZoomIn(float value);
void onZoomOut(float value);
void onZoomEnd();
}
@SuppressLint("ClickableViewAccessibility")
static void attach(Context context, View gestureView, GestureListener listener) {
final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context,
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
final float SPAN_RATIO = 600;
float initialSpan;
float prevNbStep;
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
initialSpan = detector.getCurrentSpan();
prevNbStep = 0;
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
float spanDiff = initialSpan - detector.getCurrentSpan();
float curNbStep = spanDiff / SPAN_RATIO;
float stepDiff = curNbStep - prevNbStep;
if (stepDiff > 0) {
listener.onZoomOut(stepDiff);
} else {
listener.onZoomIn(Math.abs(stepDiff));
}
prevNbStep = curNbStep;
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
listener.onZoomEnd();
}
});
gestureView.setOnTouchListener((view, motionEvent) -> {
scaleDetector.onTouchEvent(motionEvent);
return false;
});
}
}