summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Hoford <hoford@google.com>2013-04-17 13:35:03 -0700
committerJohn Hoford <hoford@google.com>2013-04-17 15:12:29 -0700
commit2967dc0912bf511d7cd97ff502c672565a548a00 (patch)
treecf984605c19d16317743a2f90d6c5d44db007300 /src
parent1b4d875d0434b226182dd37c4756ac468a660b94 (diff)
downloadandroid_packages_apps_Snap-2967dc0912bf511d7cd97ff502c672565a548a00.tar.gz
android_packages_apps_Snap-2967dc0912bf511d7cd97ff502c672565a548a00.tar.bz2
android_packages_apps_Snap-2967dc0912bf511d7cd97ff502c672565a548a00.zip
improve pinch to zoom behavior
bug:8630925 Change-Id: Ica4c4ab83e726901a8e729056529aa8379cb52ae
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java56
1 files 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();