summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java/org/fox
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-08-05 07:56:20 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-08-05 07:56:20 +0300
commit931948310c99582685eb3fe6fb4dc2099cd8b521 (patch)
tree4c1bc2b02042c35b638ecfe040fe6de75fab1525 /org.fox.ttrss/src/main/java/org/fox
parent77d387500b31e3d14d74b8bfb8e917e1be3f6264 (diff)
parent902ed40a956fd7d5ff7b27014be57f85d0463050 (diff)
Merge branch 'fix-zoomed-images' into 'master'
Add workaround for zoomed images See merge request tt-rss/tt-rss-android!53
Diffstat (limited to 'org.fox.ttrss/src/main/java/org/fox')
-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);
+ }
+}