summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChih-Chung Chang <chihchung@google.com>2012-03-21 19:01:30 +0800
committerChih-Chung Chang <chihchung@google.com>2012-03-22 12:59:11 +0800
commit2b35f06004869b859a33630bbc28238ebc0e6873 (patch)
tree58ab9c4627b0b26fc67b129d4c4c67023afd47f6 /src
parentdf47bac7c9000d50420061ac22dd259337bd160a (diff)
downloadandroid_packages_apps_Snap-2b35f06004869b859a33630bbc28238ebc0e6873.tar.gz
android_packages_apps_Snap-2b35f06004869b859a33630bbc28238ebc0e6873.tar.bz2
android_packages_apps_Snap-2b35f06004869b859a33630bbc28238ebc0e6873.zip
Patch 2 for MR1.
Change-Id: I39cc780e0ef49c4e0863a1a83e585e16f0a32425
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/ui/PhotoView.java32
-rw-r--r--src/com/android/gallery3d/ui/PositionController.java27
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);