From 387e9ebf3cde1938e5b3fb490656923d60e6a5b6 Mon Sep 17 00:00:00 2001 From: Chih-Chung Chang Date: Tue, 19 Jun 2012 17:34:50 +0800 Subject: Fade in/out the undo bar. The fading out happens after 3 seconds or the user swipes away. Bug: 6610348 Change-Id: Icd4dea7b0396f26556240adab93b9e645a9f1e58 --- src/com/android/gallery3d/app/PhotoPage.java | 6 +-- src/com/android/gallery3d/ui/PhotoView.java | 56 +++++++++++++++++++++++-- src/com/android/gallery3d/ui/UndoBarView.java | 59 +++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java index 1d9344ba3..c94454352 100644 --- a/src/com/android/gallery3d/app/PhotoPage.java +++ b/src/com/android/gallery3d/app/PhotoPage.java @@ -721,7 +721,7 @@ public class PhotoPage extends ActivityState implements mDeletePath = path; mDeleteIsFocus = (offset == 0); mMediaSet.setDeletion(path, mCurrentIndex + offset); - mPhotoView.showUndoButton(true); + mPhotoView.showUndoBar(); } @Override @@ -731,14 +731,14 @@ public class PhotoPage extends ActivityState implements if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); mMediaSet.setDeletion(null, 0); mDeletePath = null; - mPhotoView.showUndoButton(false); + mPhotoView.hideUndoBar(); } @Override public void onCommitDeleteImage() { if (mDeletePath == null) return; commitDeletion(); - mPhotoView.showUndoButton(false); + mPhotoView.hideUndoBar(); } private void commitDeletion() { diff --git a/src/com/android/gallery3d/ui/PhotoView.java b/src/com/android/gallery3d/ui/PhotoView.java index 3fba261fb..496d34d05 100644 --- a/src/com/android/gallery3d/ui/PhotoView.java +++ b/src/com/android/gallery3d/ui/PhotoView.java @@ -141,6 +141,7 @@ public class PhotoView extends GLView { private static final int MSG_CAPTURE_ANIMATION_DONE = 4; private static final int MSG_DELETE_ANIMATION_DONE = 5; private static final int MSG_DELETE_DONE = 6; + private static final int MSG_HIDE_UNDO_BAR = 7; private static final int MOVE_THRESHOLD = 256; private static final float SWIPE_THRESHOLD = 300f; @@ -221,6 +222,10 @@ public class PhotoView extends GLView { // Whether the box indicated by mTouchBoxIndex is deletable. Only meaningful // if mTouchBoxIndex is not Integer.MAX_VALUE. private boolean mTouchBoxDeletable; + // This is the index of the last deleted item. This is only used as a hint + // to hide the undo button when we are too far away from the deleted + // item. The value Integer.MAX_VALUE means there is no such hint. + private int mUndoIndexHint = Integer.MAX_VALUE; public PhotoView(GalleryActivity activity) { mTileView = new TileImageView(activity); @@ -334,6 +339,10 @@ public class PhotoView extends GLView { } break; } + case MSG_HIDE_UNDO_BAR: { + checkHideUndoBar(UNDO_BAR_TIMEOUT); + break; + } default: throw new AssertionError(message.what); } } @@ -359,6 +368,13 @@ public class PhotoView extends GLView { } } + // Hide undo button if we are too far away + if (mUndoIndexHint != Integer.MAX_VALUE) { + if (Math.abs(mUndoIndexHint - mModel.getCurrentIndex()) >= 3) { + hideUndoBar(); + } + } + // Update the ScreenNails. for (int i = -SCREEN_NAIL_MAX; i <= SCREEN_NAIL_MAX; i++) { Picture p = mPictures.get(i); @@ -1041,6 +1057,8 @@ public class PhotoView extends GLView { private void deleteAfterAnimation(int duration) { MediaItem item = mModel.getMediaItem(mTouchBoxIndex); if (item == null) return; + mListener.onCommitDeleteImage(); + mUndoIndexHint = mModel.getCurrentIndex() + mTouchBoxIndex; mHolding |= HOLD_DELETE; Message m = mHandler.obtainMessage(MSG_DELETE_ANIMATION_DONE); m.obj = item.getPath(); @@ -1136,9 +1154,10 @@ public class PhotoView extends GLView { @Override public void onDown(float x, float y) { + checkHideUndoBar(UNDO_BAR_TOUCHED); + mDeltaY = 0; mSeenScaling = false; - mListener.onCommitDeleteImage(); if (mIgnoreSwipingGesture) return; @@ -1248,8 +1267,39 @@ public class PhotoView extends GLView { setFilmMode(false); } - public void showUndoButton(boolean show) { - mUndoBar.setVisibility(show ? GLView.VISIBLE : GLView.INVISIBLE); + //////////////////////////////////////////////////////////////////////////// + // Undo Bar + //////////////////////////////////////////////////////////////////////////// + + private int mUndoBarState; + private static final int UNDO_BAR_SHOW = 1; + private static final int UNDO_BAR_TIMEOUT = 2; + private static final int UNDO_BAR_TOUCHED = 4; + + public void showUndoBar() { + mHandler.removeMessages(MSG_HIDE_UNDO_BAR); + mUndoBarState = UNDO_BAR_SHOW; + mUndoBar.animateVisibility(GLView.VISIBLE); + mHandler.sendEmptyMessageDelayed(MSG_HIDE_UNDO_BAR, 3000); + } + + public void hideUndoBar() { + mHandler.removeMessages(MSG_HIDE_UNDO_BAR); + mListener.onCommitDeleteImage(); + mUndoBar.animateVisibility(GLView.INVISIBLE); + mUndoBarState = 0; + mUndoIndexHint = Integer.MAX_VALUE; + } + + // Check if the all conditions for hiding the undo bar have been met. The + // conditions are: it has been three seconds since last showing, and the + // user has touched. + private void checkHideUndoBar(int addition) { + mUndoBarState |= addition; + if (mUndoBarState == + (UNDO_BAR_SHOW | UNDO_BAR_TIMEOUT | UNDO_BAR_TOUCHED)) { + hideUndoBar(); + } } //////////////////////////////////////////////////////////////////////////// diff --git a/src/com/android/gallery3d/ui/UndoBarView.java b/src/com/android/gallery3d/ui/UndoBarView.java index 9ddd1d755..f5ea5d1ad 100644 --- a/src/com/android/gallery3d/ui/UndoBarView.java +++ b/src/com/android/gallery3d/ui/UndoBarView.java @@ -20,6 +20,7 @@ import android.content.Context; import android.view.MotionEvent; import com.android.gallery3d.R; +import com.android.gallery3d.common.Utils; import com.android.gallery3d.util.GalleryUtils; public class UndoBarView extends GLView { @@ -89,6 +90,11 @@ public class UndoBarView extends GLView { @Override protected void render(GLCanvas canvas) { super.render(canvas); + advanceAnimation(); + + canvas.save(GLCanvas.SAVE_FLAG_ALPHA); + canvas.multiplyAlpha(mAlpha); + int w = getWidth(); int h = getHeight(); mPanel.draw(canvas, mBarMargin, 0, w - mBarMargin * 2, mBarHeight); @@ -112,6 +118,8 @@ public class UndoBarView extends GLView { x = mBarMargin + mDeletedTextMargin; y = (mBarHeight - mDeletedText.getHeight()) / 2; mDeletedText.draw(canvas, x, y); + + canvas.restore(); } @Override @@ -143,4 +151,55 @@ public class UndoBarView extends GLView { int h = getHeight(); return (x >= w - mClickRegion && x < w && y >= 0 && y < h); } + + //////////////////////////////////////////////////////////////////////////// + // Alpha Animation + //////////////////////////////////////////////////////////////////////////// + + private static final long NO_ANIMATION = -1; + private static long ANIM_TIME = 200; + private long mAnimationStartTime = NO_ANIMATION; + private float mFromAlpha, mToAlpha; + private float mAlpha; + + private static float getTargetAlpha(int visibility) { + return (visibility == VISIBLE) ? 1f : 0f; + } + + public void setVisibility(int visibility) { + mAlpha = getTargetAlpha(visibility); + mAnimationStartTime = NO_ANIMATION; + super.setVisibility(visibility); + invalidate(); + } + + public void animateVisibility(int visibility) { + float target = getTargetAlpha(visibility); + if (mAnimationStartTime == NO_ANIMATION && mAlpha == target) return; + if (mAnimationStartTime != NO_ANIMATION && mToAlpha == target) return; + + mFromAlpha = mAlpha; + mToAlpha = target; + mAnimationStartTime = AnimationTime.startTime(); + + super.setVisibility(VISIBLE); + invalidate(); + } + + private void advanceAnimation() { + if (mAnimationStartTime == NO_ANIMATION) return; + + float delta = (float) (AnimationTime.get() - mAnimationStartTime) / + ANIM_TIME; + mAlpha = mFromAlpha + ((mToAlpha > mFromAlpha) ? delta : -delta); + mAlpha = Utils.clamp(mAlpha, 0f, 1f); + + if (mAlpha == mToAlpha) { + mAnimationStartTime = NO_ANIMATION; + if (mAlpha == 0) { + super.setVisibility(INVISIBLE); + } + } + invalidate(); + } } -- cgit v1.2.3