OSDN Git Service

Use edge glow instead of snap back
authornicolasroard <nicolasroard@google.com>
Tue, 17 Sep 2013 07:51:20 +0000 (00:51 -0700)
committernicolasroard <nicolasroard@google.com>
Tue, 17 Sep 2013 07:59:04 +0000 (00:59 -0700)
Follow UX guidelines.

Change-Id: Id81d6622e174c8bb2ac53d8b04023070368d945d

res/values/filtershow_values.xml
src/com/android/gallery3d/filtershow/imageshow/ImageShow.java

index 69eb49d..a788afe 100644 (file)
@@ -62,4 +62,7 @@
 
     <!-- draw check UI size  -->
     <dimen name="draw_ui_width">192dip</dimen>
+
+    <!-- Glow effect size -->
+    <dimen name="edge_glow_size">50dip</dimen>
 </resources>
\ No newline at end of file
index 3a799ef..d890353 100644 (file)
@@ -30,6 +30,7 @@ import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Shader;
 import android.graphics.drawable.NinePatchDrawable;
+import android.support.v4.widget.EdgeEffectCompat;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.GestureDetector;
@@ -93,6 +94,14 @@ public class ImageShow extends View implements OnGestureListener,
     float mOriginalScale;
     float mStartFocusX, mStartFocusY;
 
+    private EdgeEffectCompat mEdgeEffect = null;
+    private static final int EDGE_LEFT = 1;
+    private static final int EDGE_TOP = 2;
+    private static final int EDGE_RIGHT = 3;
+    private static final int EDGE_BOTTOM = 4;
+    private int mCurrentEdgeEffect = 0;
+    private int mEdgeSize = 100;
+
     private enum InteractionMode {
         NONE,
         SCALE,
@@ -165,6 +174,8 @@ public class ImageShow extends View implements OnGestureListener,
             Bitmap mask = BitmapFactory.decodeResource(res, R.drawable.spot_mask);
             sMask = convertToAlphaMask(mask);
         }
+        mEdgeEffect = new EdgeEffectCompat(context);
+        mEdgeSize = res.getDimensionPixelSize(R.dimen.edge_glow_size);
     }
 
     public void attach() {
@@ -273,6 +284,30 @@ public class ImageShow extends View implements OnGestureListener,
         drawCompareImage(canvas, getGeometryOnlyImage());
 
         canvas.restore();
+
+        if (!mEdgeEffect.isFinished()) {
+            canvas.save();
+            float dx = (getHeight() - getWidth()) / 2f;
+            if (getWidth() > getHeight()) {
+                dx = - (getWidth() - getHeight()) / 2f;
+            }
+            if (mCurrentEdgeEffect == EDGE_BOTTOM) {
+                canvas.rotate(180, getWidth()/2, getHeight()/2);
+            } else if (mCurrentEdgeEffect == EDGE_RIGHT) {
+                canvas.rotate(90, getWidth()/2, getHeight()/2);
+                canvas.translate(0, dx);
+            } else if (mCurrentEdgeEffect == EDGE_LEFT) {
+                canvas.rotate(270, getWidth()/2, getHeight()/2);
+                canvas.translate(0, dx);
+            }
+            if (mCurrentEdgeEffect != 0) {
+                mEdgeEffect.draw(canvas);
+            }
+            canvas.restore();
+            invalidate();
+        } else {
+            mCurrentEdgeEffect = 0;
+        }
     }
 
     private void drawHighresImage(Canvas canvas, Bitmap fullHighres) {
@@ -616,16 +651,17 @@ public class ImageShow extends View implements OnGestureListener,
             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();
             }
         }
 
+        float scaleFactor = MasterImage.getImage().getScaleFactor();
+        Point translation = MasterImage.getImage().getTranslation();
+        constrainTranslation(translation, scaleFactor);
+        MasterImage.getImage().setTranslation(translation);
+
         invalidate();
         return true;
     }
@@ -656,25 +692,63 @@ public class ImageShow extends View implements OnGestureListener,
     }
 
     private void constrainTranslation(Point translation, float scale) {
+        int currentEdgeEffect = 0;
+        if (scale <= 1) {
+            mCurrentEdgeEffect = 0;
+            return;
+        }
+
         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);
+
+        boolean rightConstraint = screenPos.right < getWidth() - mShadowMargin;
+        boolean leftConstraint = screenPos.left > mShadowMargin;
+        boolean topConstraint = screenPos.top > mShadowMargin;
+        boolean bottomConstraint = screenPos.bottom < getHeight() - mShadowMargin;
+
+        if (screenPos.width() > getWidth()) {
+            if (rightConstraint && !leftConstraint) {
+                float tx = screenPos.right - translation.x * scale;
+                translation.x = (int) ((getWidth() - mShadowMargin - tx) / scale);
+                currentEdgeEffect = EDGE_RIGHT;
+            } else if (leftConstraint && !rightConstraint) {
+                float tx = screenPos.left - translation.x * scale;
+                translation.x = (int) ((mShadowMargin - tx) / scale);
+                currentEdgeEffect = EDGE_LEFT;
+            }
+        } else {
+            float tx = screenPos.right - translation.x * scale;
+            float dx = (getWidth() - 2 * mShadowMargin - screenPos.width()) / 2f;
+            translation.x = (int) ((getWidth() - mShadowMargin - tx - dx) / 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);
+
+        if (screenPos.height() > getHeight()) {
+            if (bottomConstraint && !topConstraint) {
+                float ty = screenPos.bottom - translation.y * scale;
+                translation.y = (int) ((getHeight() - mShadowMargin - ty) / scale);
+                currentEdgeEffect = EDGE_BOTTOM;
+            } else if (topConstraint && !bottomConstraint) {
+                float ty = screenPos.top - translation.y * scale;
+                translation.y = (int) ((mShadowMargin - ty) / scale);
+                currentEdgeEffect = EDGE_TOP;
+            }
+        } else {
+            float ty = screenPos.bottom - translation.y * scale;
+            float dy = (getHeight()- 2 * mShadowMargin - screenPos.height()) / 2f;
+            translation.y = (int) ((getHeight() - mShadowMargin - ty - dy) / scale);
+        }
+
+        if (mCurrentEdgeEffect != currentEdgeEffect) {
+            if (mCurrentEdgeEffect == 0 || currentEdgeEffect != 0) {
+                mCurrentEdgeEffect = currentEdgeEffect;
+            }
+            mEdgeEffect.finish();
+            mEdgeEffect.setSize(getWidth(), mEdgeSize);
+            mEdgeEffect.onPull(mEdgeSize);
+        } else {
+            mEdgeEffect.onPull(mEdgeSize);
         }
     }