summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src
diff options
context:
space:
mode:
authorvjkcxl <349-vjkcxl@users.noreply.gitlab.tt-rss.org>2025-08-04 22:48:45 -0500
committervjkcxl <349-vjkcxl@users.noreply.gitlab.tt-rss.org>2025-08-04 22:48:45 -0500
commit902ed40a956fd7d5ff7b27014be57f85d0463050 (patch)
tree4c1bc2b02042c35b638ecfe040fe6de75fab1525 /org.fox.ttrss/src
parent77d387500b31e3d14d74b8bfb8e917e1be3f6264 (diff)
Add workaround for zoomed images
This should allow moving around on zoomed images. Pagination will kick back in when you get close enough to an edge.
Diffstat (limited to 'org.fox.ttrss/src')
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java2
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/PagerAwareImageMatrixTouchHandler.java90
2 files changed, 91 insertions, 1 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
index cae52798..873706e0 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryImageFragment.java
@@ -44,7 +44,7 @@ public class GalleryImageFragment extends GalleryBaseFragment {
ImageView imgView = view.findViewById(R.id.flavor_image);
// TODO: ImageMatrixTouchHandler doesn't like context menus
- ImageMatrixTouchHandler touchHandler = new ImageMatrixTouchHandler(view.getContext());
+ ImageMatrixTouchHandler touchHandler = new PagerAwareImageMatrixTouchHandler(view.getContext());
imgView.setOnTouchListener(touchHandler);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/PagerAwareImageMatrixTouchHandler.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/PagerAwareImageMatrixTouchHandler.java
new file mode 100644
index 00000000..46609f8f
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/PagerAwareImageMatrixTouchHandler.java
@@ -0,0 +1,90 @@
+package org.fox.ttrss;
+
+import android.content.Context;
+import android.graphics.Matrix;
+import android.graphics.drawable.Drawable;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.bogdwellers.pinchtozoom.ImageMatrixTouchHandler;
+
+// Based on https://github.com/martinwithaar/PinchToZoom/blob/master/pinchtozoom/src/main/java/com/bogdwellers/pinchtozoom/view/ImageViewPager.java
+// mLastMotionX is a simplified version of ViewPager's MotionEvent logic
+public class PagerAwareImageMatrixTouchHandler extends ImageMatrixTouchHandler {
+ /**
+ * NOT Thread safe! (But it all happens on the UI thread anyway)
+ */
+ private static final float[] VALUES = new float[9];
+
+ private static final float SCALE_THRESHOLD = 1.2f;
+
+ private float mLastMotionX;
+
+ public PagerAwareImageMatrixTouchHandler(Context context) {
+ super(context);
+ }
+
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ super.onTouch(view, event);
+
+ if (event.getPointerCount() > 1) {
+ view.getParent().requestDisallowInterceptTouchEvent(true);
+ return true;
+ }
+
+ if (event.getAction() != MotionEvent.ACTION_MOVE)
+ {
+ return true;
+ }
+
+ float x = event.getX(0);
+ float dx = x - mLastMotionX;
+ mLastMotionX = x;
+
+ ImageView iv = (ImageView) view;
+ Drawable drawable = iv.getDrawable();
+ if (drawable != null) {
+ float vw = iv.getWidth();
+ float vh = iv.getHeight();
+ float dw = drawable.getIntrinsicWidth();
+ float dh = drawable.getIntrinsicHeight();
+
+ Matrix matrix = iv.getImageMatrix();
+ matrix.getValues(VALUES);
+ float tx = VALUES[Matrix.MTRANS_X] + dx;
+ float sdw = dw * VALUES[Matrix.MSCALE_X];
+
+ boolean blockScroll = VALUES[Matrix.MSCALE_X] / centerInsideScale(vw, vh, dw, dh) > SCALE_THRESHOLD && !translationExceedsBoundary(tx, vw, sdw) && sdw > vw; // Assumes x-y scales are equal
+ view.getParent().requestDisallowInterceptTouchEvent(blockScroll);
+ }
+
+ return true;
+ }
+
+ /**
+ * <p>Returns the scale ratio between view and drawable for the longest side.</p>
+ *
+ * @param vw
+ * @param vh
+ * @param dw
+ * @param dh
+ * @return
+ */
+ public static final float centerInsideScale(float vw, float vh, float dw, float dh) {
+ return vw / vh <= dw / dh ? vw / dw : vh / dh;
+ }
+
+ /**
+ * <p>Determines whether a translation makes the view exceed the boundary of a drawable.</p>
+ *
+ * @param tx
+ * @param vw
+ * @param dw
+ * @return
+ */
+ public static final boolean translationExceedsBoundary(float tx, float vw, float dw) {
+ return dw >= vw && (tx > 0 || tx < vw - dw);
+ }
+}