From 42c1892ab508a02ea957fe8796086362e163c123 Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Wed, 21 Mar 2012 19:01:30 +0800 Subject: [PATCH] Patch 2 for MR1. Change-Id: I39cc780e0ef49c4e0863a1a83e585e16f0a32425 --- src/com/android/gallery3d/ui/PhotoView.java | 32 +++++++++++++++++++++- .../android/gallery3d/ui/PositionController.java | 27 +++++++++++++++--- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/com/android/gallery3d/ui/PhotoView.java b/src/com/android/gallery3d/ui/PhotoView.java index aeed57771..217a290f1 100644 --- a/src/com/android/gallery3d/ui/PhotoView.java +++ b/src/com/android/gallery3d/ui/PhotoView.java @@ -43,6 +43,7 @@ public class PhotoView extends GLView { private static final int MSG_TRANSITION_COMPLETE = 1; private static final int MSG_SHOW_LOADING = 2; + private static final int MSG_CANCEL_EXTRA_SCALING = 3; private static final long DELAY_SHOW_LOADING = 250; // 250ms; @@ -111,6 +112,7 @@ public class PhotoView extends GLView { private Path mOpenedItemPath; private GalleryActivity mActivity; private Point mImageCenter = new Point(); + private boolean mCancelExtraScalingPending; public PhotoView(GalleryActivity activity) { mActivity = activity; @@ -146,6 +148,12 @@ public class PhotoView extends GLView { } break; } + case MSG_CANCEL_EXTRA_SCALING: { + cancelScaleGesture(); + mPositionController.setExtraScalingRange(false); + mCancelExtraScalingPending = false; + break; + } default: throw new AssertionError(message.what); } } @@ -585,8 +593,22 @@ public class PhotoView extends GLView { float scale = detector.getScaleFactor(); if (Float.isNaN(scale) || Float.isInfinite(scale) || mTransitionMode != TRANS_NONE) return true; - mPositionController.scaleBy(scale, + boolean outOfRange = mPositionController.scaleBy(scale, detector.getFocusX(), detector.getFocusY()); + if (outOfRange) { + if (!mCancelExtraScalingPending) { + mHandler.sendEmptyMessageDelayed( + MSG_CANCEL_EXTRA_SCALING, 700); + mPositionController.setExtraScalingRange(true); + mCancelExtraScalingPending = true; + } + } else { + if (mCancelExtraScalingPending) { + mHandler.removeMessages(MSG_CANCEL_EXTRA_SCALING); + mPositionController.setExtraScalingRange(false); + mCancelExtraScalingPending = false; + } + } return true; } @@ -605,6 +627,14 @@ public class PhotoView extends GLView { } } + private void cancelScaleGesture() { + long now = SystemClock.uptimeMillis(); + MotionEvent cancelEvent = MotionEvent.obtain( + now, now, MotionEvent.ACTION_CANCEL, 0, 0, 0); + mScaleDetector.onTouchEvent(cancelEvent); + cancelEvent.recycle(); + } + public boolean jumpTo(int index) { if (mTransitionMode != TRANS_NONE) return false; mModel.jumpTo(index); diff --git a/src/com/android/gallery3d/ui/PositionController.java b/src/com/android/gallery3d/ui/PositionController.java index b4dac973f..206844639 100644 --- a/src/com/android/gallery3d/ui/PositionController.java +++ b/src/com/android/gallery3d/ui/PositionController.java @@ -64,6 +64,9 @@ class PositionController { private static final float SCALE_LIMIT = 4; private static final int sHorizontalSlack = GalleryUtils.dpToPixel(12); + private static final float SCALE_MIN_EXTRA = 0.6f; + private static final float SCALE_MAX_EXTRA = 1.4f; + private PhotoView mViewer; private EdgeView mEdgeView; private int mImageW, mImageH; @@ -83,6 +86,7 @@ class PositionController { // The minimum and maximum scale we allow. private float mScaleMin, mScaleMax = SCALE_LIMIT; + private boolean mExtraScalingRange = false; // This is used by the fling animation private FlingScroller mScroller; @@ -268,7 +272,8 @@ class PositionController { (focusY - mViewH / 2f) / mCurrentScale); } - public void scaleBy(float s, float focusX, float focusY) { + // Returns true if the result scale is outside the stable range. + public boolean scaleBy(float s, float focusX, float focusY) { // We want to keep the focus point (on the bitmap) the same as when // we begin the scale guesture, that is, @@ -280,6 +285,7 @@ class PositionController { int y = Math.round(mFocusBitmapY - (focusY - mViewH / 2f) / s); startAnimation(x, y, s, ANIM_KIND_SCALE); + return (s < mScaleMin || s > mScaleMax); } public void endScale() { @@ -287,6 +293,13 @@ class PositionController { startSnapbackIfNeeded(); } + public void setExtraScalingRange(boolean enabled) { + mExtraScalingRange = enabled; + if (!enabled) { + startSnapbackIfNeeded(); + } + } + public float getCurrentScale() { return mCurrentScale; } @@ -400,7 +413,8 @@ class PositionController { mToX = targetX; mToY = targetY; - mToScale = Utils.clamp(scale, 0.6f * mScaleMin, 1.4f * mScaleMax); + mToScale = Utils.clamp(scale, SCALE_MIN_EXTRA * mScaleMin, + SCALE_MAX_EXTRA * mScaleMax); // If the scaled height is smaller than the view height, // force it to be in the center. @@ -540,9 +554,14 @@ class PositionController { boolean needAnimation = false; float scale = mCurrentScale; - if (mCurrentScale < mScaleMin || mCurrentScale > mScaleMax) { + float scaleMin = mExtraScalingRange ? + mScaleMin * SCALE_MIN_EXTRA : mScaleMin; + float scaleMax = mExtraScalingRange ? + mScaleMax * SCALE_MAX_EXTRA : mScaleMax; + + if (mCurrentScale < scaleMin || mCurrentScale > scaleMax) { needAnimation = true; - scale = Utils.clamp(mCurrentScale, mScaleMin, mScaleMax); + scale = Utils.clamp(mCurrentScale, scaleMin, scaleMax); } calculateStableBound(scale, sHorizontalSlack); -- 2.11.0