diff options
author | nicolasroard <nicolasroard@google.com> | 2013-09-17 00:51:20 -0700 |
---|---|---|
committer | nicolasroard <nicolasroard@google.com> | 2013-09-17 00:59:04 -0700 |
commit | ef8d4d2cfbd1ee16d5646a9460a56302d06a0784 (patch) | |
tree | ed29d8dbefe84ff9c67dab93af317e09a1a5825b /src | |
parent | 463b918edda204f1563dc2e27976cafa6af9a769 (diff) | |
download | android_packages_apps_Gallery2-ef8d4d2cfbd1ee16d5646a9460a56302d06a0784.tar.gz android_packages_apps_Gallery2-ef8d4d2cfbd1ee16d5646a9460a56302d06a0784.tar.bz2 android_packages_apps_Gallery2-ef8d4d2cfbd1ee16d5646a9460a56302d06a0784.zip |
Use edge glow instead of snap back
Follow UX guidelines.
Change-Id: Id81d6622e174c8bb2ac53d8b04023070368d945d
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/gallery3d/filtershow/imageshow/ImageShow.java | 110 |
1 files changed, 92 insertions, 18 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 3a799ef5d..d890353b8 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -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); } } |