From e10fd68874fa3cff0e5c3ca07f1e5b9d40be1299 Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Thu, 12 Sep 2013 10:26:57 -0700 Subject: [PATCH] Fix constrained zoom Change-Id: I3613ba23154897e9b7c1677ec9911453b5f73c0f --- .../gallery3d/filtershow/imageshow/ImageShow.java | 41 +++++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 3234c2516..c981b777d 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -31,6 +31,7 @@ import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.NinePatchDrawable; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnDoubleTapListener; import android.view.GestureDetector.OnGestureListener; @@ -596,7 +597,6 @@ public class ImageShow extends View implements OnGestureListener, Point translation = MasterImage.getImage().getTranslation(); translation.x = (int) (originalTranslation.x + translateX); translation.y = (int) (originalTranslation.y + translateY); - constrainTranslation(translation, scaleFactor); MasterImage.getImage().setTranslation(translation); mTouchShowOriginal = false; } else if (enableComparison() && !mOriginalDisabled @@ -607,18 +607,25 @@ public class ImageShow extends View implements OnGestureListener, } } - if (action == MotionEvent.ACTION_UP) { + if (action == MotionEvent.ACTION_UP + || action == MotionEvent.ACTION_CANCEL + || action == MotionEvent.ACTION_OUTSIDE) { mInteractionMode = InteractionMode.NONE; mTouchShowOriginal = false; mTouchDown.x = 0; mTouchDown.y = 0; mTouch.x = 0; mTouch.y = 0; + float scaleFactor = MasterImage.getImage().getScaleFactor(); + Point translation = MasterImage.getImage().getTranslation(); + constrainTranslation(translation, scaleFactor); + MasterImage.getImage().setTranslation(translation); if (MasterImage.getImage().getScaleFactor() <= 1) { MasterImage.getImage().setScaleFactor(1); MasterImage.getImage().resetTranslation(); } } + invalidate(); return true; } @@ -649,15 +656,25 @@ public class ImageShow extends View implements OnGestureListener, } private void constrainTranslation(Point translation, float scale) { - float maxTranslationX = getWidth() / scale; - float maxTranslationY = getHeight() / scale; - if (Math.abs(translation.x) > maxTranslationX) { - translation.x = (int) (Math.signum(translation.x) * - maxTranslationX); - if (Math.abs(translation.y) > maxTranslationY) { - translation.y = (int) (Math.signum(translation.y) * - maxTranslationY); - } + Matrix originalToScreen = MasterImage.getImage().originalImageToScreen(); + Matrix screenToOriginal = new Matrix(); + originalToScreen.invert(screenToOriginal); + Rect originalBounds = MasterImage.getImage().getOriginalBounds(); + RectF screenPos = new RectF(originalBounds); + originalToScreen.mapRect(screenPos); + if (screenPos.right < getWidth() - mShadowMargin) { + float tx = mImageBounds.right - translation.x * scale; + translation.x = (int) ((getWidth() - mShadowMargin - tx) / scale); + } else if (screenPos.left > mShadowMargin) { + float tx = mImageBounds.left - translation.x * scale; + translation.x = (int) ((mShadowMargin - tx) / scale); + } + if (screenPos.bottom < getHeight() - mShadowMargin) { + float ty = mImageBounds.bottom - translation.y * scale; + translation.y = (int) ((getHeight() - mShadowMargin - ty) / scale); + } else if (screenPos.top > mShadowMargin) { + float ty = mImageBounds.top - translation.y * scale; + translation.y = (int) ((mShadowMargin - ty) / scale); } } @@ -733,9 +750,7 @@ public class ImageShow extends View implements OnGestureListener, Point translation = MasterImage.getImage().getTranslation(); translation.x = (int) (mOriginalTranslation.x + translateX); translation.y = (int) (mOriginalTranslation.y + translateY); - constrainTranslation(translation, scaleFactor); MasterImage.getImage().setTranslation(translation); - invalidate(); return true; } -- 2.11.0