From: Michael Kolb Date: Tue, 7 May 2013 20:53:19 +0000 (-0700) Subject: Add animation to slice selection X-Git-Tag: android-x86-7.1-r1~610^2~44^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=67339f9ab0b3d583ee0f519d65617f3ab39c4bd5;p=android-x86%2Fpackages-apps-Gallery2.git Add animation to slice selection Bug: 8826233 Change-Id: Ibe41c38e048546b66ea9aa56a664ba80de2fbd4c --- diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java index 4328b95ae..bdbe6129f 100644 --- a/src/com/android/camera/ui/PieRenderer.java +++ b/src/com/android/camera/ui/PieRenderer.java @@ -71,6 +71,7 @@ public class PieRenderer extends OverlayRenderer private static final long PIE_XFADE_DURATION = 200; private static final long PIE_SELECT_FADE_DURATION = 300; private static final long PIE_OPEN_SUB_DELAY = 400; + private static final long PIE_SLICE_DURATION = 80; private static final int MSG_OPEN = 0; private static final int MSG_CLOSE = 1; @@ -133,6 +134,7 @@ public class PieRenderer extends OverlayRenderer private LinearAnimation mXFade; private LinearAnimation mFadeIn; private FadeOutAnimation mFadeOut; + private LinearAnimation mSlice; private volatile boolean mFocusCancelled; private PointF mPolar = new PointF(); private TextDrawable mLabel; @@ -571,7 +573,12 @@ public class PieRenderer extends OverlayRenderer if (item.isSelected()) { Paint p = mSelectedPaint; int state = canvas.save(); - float angle = getArcCenter(item, pos, count) - SWEEP_ARC / 2f; + float angle = 0; + if (mSlice != null) { + angle = mSlice.getValue(); + } else { + angle = getArcCenter(item, pos, count) - SWEEP_ARC / 2f; + } angle = getDegrees(angle); canvas.rotate(angle, mPieCenterX, y); if (mFadeOut != null) { @@ -715,6 +722,7 @@ public class PieRenderer extends OverlayRenderer mCurrentItem.setSelected(false); } if (item != null && item.isEnabled()) { + moveSelection(mCurrentItem, item); item.setSelected(true); mCurrentItem = item; mLabel.setText(mCurrentItem.getLabel()); @@ -764,6 +772,44 @@ public class PieRenderer extends OverlayRenderer } } + private int getItemPos(PieItem target) { + List items = getOpenItem().getItems(); + return items.indexOf(target); + } + + private int getCurrentCount() { + return getOpenItem().getItems().size(); + } + + private void moveSelection(PieItem from, PieItem to) { + final int count = getCurrentCount(); + final int fromPos = getItemPos(from); + final int toPos = getItemPos(to); + if (fromPos != -1 && toPos != -1) { + float startAngle = getArcCenter(from, getItemPos(from), count) + - SWEEP_ARC / 2f; + float endAngle = getArcCenter(to, getItemPos(to), count) + - SWEEP_ARC / 2f; + mSlice = new LinearAnimation(startAngle, endAngle); + mSlice.setDuration(PIE_SLICE_DURATION); + mSlice.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationEnd(Animation arg0) { + mSlice = null; + } + + @Override + public void onAnimationRepeat(Animation arg0) { + } + + @Override + public void onAnimationStart(Animation arg0) { + } + }); + mOverlay.startAnimation(mSlice); + } + } + private void openCurrentItem() { if ((mCurrentItem != null) && mCurrentItem.hasItems()) { mOpen.add(mCurrentItem);