From 0a52dc428a9c185305d360b0792f7da0281d165b Mon Sep 17 00:00:00 2001 From: John Hoford Date: Wed, 17 Apr 2013 13:35:03 -0700 Subject: [PATCH] improve pinch to zoom behavior bug:8630925 Change-Id: Ica4c4ab83e726901a8e729056529aa8379cb52ae --- .../gallery3d/filtershow/imageshow/ImageShow.java | 56 ++++++++++++++++++---- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 65fe523c0..045c1a538 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -28,6 +28,7 @@ import android.graphics.RectF; import android.net.Uri; import android.os.Handler; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnDoubleTapListener; import android.view.GestureDetector.OnGestureListener; @@ -83,14 +84,22 @@ public class ImageShow extends View implements OnGestureListener, private static int mOriginalTextSize = 26; private static String mOriginalText = "Original"; private boolean mZoomIn = false; - - protected GeometryMetadata getGeometry() { - return new GeometryMetadata(getImagePreset().mGeoData); + Point mOriginalTranslation = new Point(); + float mOriginalScale; + float mStartFocusX, mStartFocusY; + private enum InteractionMode { + NONE, + SCALE, + MOVE } - private String mToast = null; private boolean mShowToast = false; private boolean mImportantToast = false; + InteractionMode mInteractionMode = InteractionMode.NONE; + + protected GeometryMetadata getGeometry() { + return new GeometryMetadata(getImagePreset().mGeoData); + } private PanelController mController = null; @@ -559,9 +568,15 @@ public class ImageShow extends View implements OnGestureListener, @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); + int action = event.getAction(); + action = action & MotionEvent.ACTION_MASK; + mGestureDetector.onTouchEvent(event); boolean scaleInProgress = scaleInProgress(); mScaleGestureDetector.onTouchEvent(event); + if (mInteractionMode == InteractionMode.SCALE) { + return true; + } if (!scaleInProgress() && scaleInProgress) { // If we were scaling, the scale will stop but we will // still issue an ACTION_UP. Let the subclasses know. @@ -570,7 +585,8 @@ public class ImageShow extends View implements OnGestureListener, int ex = (int) event.getX(); int ey = (int) event.getY(); - if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (action == MotionEvent.ACTION_DOWN) { + mInteractionMode = InteractionMode.MOVE; mTouchDown.x = ex; mTouchDown.y = ey; mTouchShowOriginalDate = System.currentTimeMillis(); @@ -578,7 +594,7 @@ public class ImageShow extends View implements OnGestureListener, MasterImage.getImage().setOriginalTranslation(MasterImage.getImage().getTranslation()); } - if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (action == MotionEvent.ACTION_MOVE && mInteractionMode == InteractionMode.MOVE) { mTouch.x = ex; mTouch.y = ey; @@ -600,7 +616,8 @@ public class ImageShow extends View implements OnGestureListener, } } - if (event.getAction() == MotionEvent.ACTION_UP) { + if (action == MotionEvent.ACTION_UP) { + mInteractionMode = InteractionMode.NONE; mTouchShowOriginal = false; mTouchDown.x = 0; mTouchDown.y = 0; @@ -699,7 +716,10 @@ public class ImageShow extends View implements OnGestureListener, @Override public boolean onScale(ScaleGestureDetector detector) { - float scaleFactor = MasterImage.getImage().getScaleFactor(); + MasterImage img = MasterImage.getImage(); + float scaleFactor = img.getScaleFactor(); + Point pos = img.getTranslation(); + scaleFactor = scaleFactor * detector.getScaleFactor(); if (scaleFactor > MasterImage.getImage().getMaxScaleFactor()) { scaleFactor = MasterImage.getImage().getMaxScaleFactor(); @@ -708,16 +728,36 @@ public class ImageShow extends View implements OnGestureListener, scaleFactor = 0.5f; } MasterImage.getImage().setScaleFactor(scaleFactor); + scaleFactor = img.getScaleFactor(); + pos = img.getTranslation(); + float focusx = detector.getFocusX(); + float focusy = detector.getFocusY(); + float translateX = (focusx - mStartFocusX) / scaleFactor; + float translateY = (focusy - mStartFocusY) / scaleFactor; + Point translation = MasterImage.getImage().getTranslation(); + translation.x = (int) (mOriginalTranslation.x + translateX); + translation.y = (int) (mOriginalTranslation.y + translateY); + MasterImage.getImage().setTranslation(translation); + + invalidate(); return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { + Point pos = MasterImage.getImage().getTranslation(); + mOriginalTranslation.x = pos.x; + mOriginalTranslation.y = pos.y; + mOriginalScale = MasterImage.getImage().getScaleFactor(); + mStartFocusX = detector.getFocusX(); + mStartFocusY = detector.getFocusY(); + mInteractionMode = InteractionMode.SCALE; return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { + mInteractionMode = InteractionMode.NONE; if (MasterImage.getImage().getScaleFactor() < 1) { MasterImage.getImage().setScaleFactor(1); invalidate(); -- 2.11.0