Move gesture detectors and listeners in the GestureHelper class/file
This commit is contained in:
parent
0ac0102a8a
commit
f7289be8a5
@ -0,0 +1,71 @@
|
||||
package org.grapheneos.pdfviewer;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import android.view.View;
|
||||
|
||||
/*
|
||||
The GestureHelper present a simple gesture api for the PdfViewer
|
||||
*/
|
||||
|
||||
class GestureHelper {
|
||||
public interface GestureListener {
|
||||
boolean onTapUp();
|
||||
// Can be replaced with ratio when supported
|
||||
void onZoomIn(int steps);
|
||||
void onZoomOut(int steps);
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
static void attach(Context context, View gestureView, GestureListener listener) {
|
||||
|
||||
final GestureDetector detector = new GestureDetector(context,
|
||||
new GestureDetector.SimpleOnGestureListener() {
|
||||
@Override
|
||||
public boolean onSingleTapUp(MotionEvent motionEvent) {
|
||||
return listener.onTapUp();
|
||||
}
|
||||
});
|
||||
|
||||
final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context,
|
||||
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
|
||||
// As the zoom value is discrete we listen to scaling step and not scaling ratio
|
||||
float SPAN_STEP = 150;
|
||||
float initialSpan;
|
||||
int prevNbStep;
|
||||
|
||||
@Override
|
||||
public boolean onScaleBegin(ScaleGestureDetector detector) {
|
||||
initialSpan = detector.getCurrentSpan();
|
||||
prevNbStep = 0;
|
||||
return super.onScaleBegin(detector);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onScale(ScaleGestureDetector detector) {
|
||||
float spanDiff = initialSpan - detector.getCurrentSpan();
|
||||
int curNbStep = (int) (spanDiff/SPAN_STEP);
|
||||
if (curNbStep != prevNbStep) {
|
||||
int stepDiff = curNbStep - prevNbStep;
|
||||
if (stepDiff > 0) {
|
||||
listener.onZoomOut(stepDiff);
|
||||
} else {
|
||||
listener.onZoomIn(Math.abs(stepDiff));
|
||||
}
|
||||
prevNbStep = curNbStep;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
gestureView.setOnTouchListener((view, motionEvent) -> {
|
||||
detector.onTouchEvent(motionEvent);
|
||||
scaleDetector.onTouchEvent(motionEvent);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -8,13 +8,10 @@ import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.Gravity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import android.view.View;
|
||||
import android.webkit.CookieManager;
|
||||
import android.webkit.JavascriptInterface;
|
||||
@ -235,10 +232,10 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
||||
|
||||
showSystemUi();
|
||||
|
||||
final GestureDetector detector = new GestureDetector(PdfViewer.this,
|
||||
new GestureDetector.SimpleOnGestureListener() {
|
||||
GestureHelper.attach(PdfViewer.this, mWebView,
|
||||
new GestureHelper.GestureListener() {
|
||||
@Override
|
||||
public boolean onSingleTapUp(MotionEvent motionEvent) {
|
||||
public boolean onTapUp() {
|
||||
if (mUri != null) {
|
||||
mWebView.evaluateJavascript("isTextSelected()", selection -> {
|
||||
if (!Boolean.valueOf(selection)) {
|
||||
@ -254,49 +251,22 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(PdfViewer.this,
|
||||
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
|
||||
// As the zoom value is discrete we listen to scaling step and not scaling ratio
|
||||
float SPAN_STEP = 150;
|
||||
float initialSpan;
|
||||
int prevNbStep;
|
||||
|
||||
@Override
|
||||
public boolean onScaleBegin(ScaleGestureDetector detector) {
|
||||
initialSpan = detector.getCurrentSpan();
|
||||
prevNbStep = 0;
|
||||
return super.onScaleBegin(detector);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onScale(ScaleGestureDetector detector) {
|
||||
float spanDiff = initialSpan - detector.getCurrentSpan();
|
||||
int curNbStep = (int) (spanDiff/SPAN_STEP);
|
||||
if (curNbStep != prevNbStep) {
|
||||
int stepDiff = curNbStep - prevNbStep;
|
||||
if (stepDiff > 0) {
|
||||
for (int i = prevNbStep; i < curNbStep; i++) {
|
||||
zoomOut();
|
||||
}
|
||||
} else {
|
||||
for (int i = prevNbStep; i > curNbStep; i--) {
|
||||
zoomIn();
|
||||
}
|
||||
}
|
||||
prevNbStep = curNbStep;
|
||||
public void onZoomIn(int steps) {
|
||||
for (int i = 0; i < steps; i++) {
|
||||
zoomIn();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onZoomOut(int steps) {
|
||||
for (int i = 0; i < steps; i++) {
|
||||
zoomOut();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
mWebView.setOnTouchListener((view, motionEvent) -> {
|
||||
detector.onTouchEvent(motionEvent);
|
||||
scaleDetector.onTouchEvent(motionEvent);
|
||||
return false;
|
||||
});
|
||||
|
||||
mTextView = new TextView(this);
|
||||
mTextView.setBackgroundColor(Color.DKGRAY);
|
||||
mTextView.setTextColor(ColorStateList.valueOf(Color.WHITE));
|
||||
|
Loading…
Reference in New Issue
Block a user