From ebcf6fed531d00cfb6900a1fb5d83c60aa7f9693 Mon Sep 17 00:00:00 2001 From: Michael Kolb Date: Wed, 27 Feb 2013 11:00:31 -0800 Subject: Highlight menu selection better Keep the selected slice highlighted longer before fading out Timing might need further adjusting Change-Id: I9c3febf4ad2b73f2c80d47259fa9cd7578445dd4 --- src/com/android/camera/ui/PieRenderer.java | 96 +++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 23 deletions(-) (limited to 'src/com') diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java index 95597b2a1..b60d9f668 100644 --- a/src/com/android/camera/ui/PieRenderer.java +++ b/src/com/android/camera/ui/PieRenderer.java @@ -16,8 +16,6 @@ package com.android.camera.ui; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; @@ -37,7 +35,6 @@ import android.view.animation.LinearInterpolator; import android.view.animation.Transformation; import com.android.gallery3d.R; -import com.android.gallery3d.common.ApiHelper; import java.util.ArrayList; import java.util.List; @@ -63,6 +60,8 @@ public class PieRenderer extends OverlayRenderer private static final int SCALING_DOWN_TIME = 100; private static final int DISAPPEAR_TIMEOUT = 200; private static final int DIAL_HORIZONTAL = 157; + // fade out timings + private static final int PIE_FADE_OUT_DURATION = 600; private static final long PIE_FADE_IN_DURATION = 200; private static final long PIE_XFADE_DURATION = 200; @@ -117,6 +116,7 @@ public class PieRenderer extends OverlayRenderer private boolean mOpening; private LinearAnimation mXFade; private LinearAnimation mFadeIn; + private FadeOutAnimation mFadeOut; private volatile boolean mFocusCancelled; private Handler mHandler = new Handler() { @@ -347,21 +347,35 @@ public class PieRenderer extends OverlayRenderer return (float) (360 - 180 * angle / Math.PI); } - private void startFadeOut() { - if (ApiHelper.HAS_VIEW_PROPERTY_ANIMATOR) { - mOverlay.animate().alpha(0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - deselect(); - show(false); - mOverlay.setAlpha(1); - super.onAnimationEnd(animation); - } - }).setDuration(PIE_SELECT_FADE_DURATION); - } else { - deselect(); - show(false); + private void startFadeOut(final PieItem item) { + if (mFadeIn != null) { + mFadeIn.cancel(); } + if (mXFade != null) { + mXFade.cancel(); + } + mFadeOut = new FadeOutAnimation(); + mFadeOut.setDuration(PIE_FADE_OUT_DURATION); + mFadeOut.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + item.performClick(); + mFadeOut = null; + deselect(); + show(false); + mOverlay.setAlpha(1); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + mFadeOut.startNow(); + mOverlay.startAnimation(mFadeOut); } @Override @@ -371,6 +385,8 @@ public class PieRenderer extends OverlayRenderer alpha = mXFade.getValue(); } else if (mFadeIn != null) { alpha = mFadeIn.getValue(); + } else if (mFadeOut != null) { + alpha = mFadeOut.getValue(); } int state = canvas.save(); if (mFadeIn != null) { @@ -390,7 +406,11 @@ public class PieRenderer extends OverlayRenderer } if (mOpenItem != null) { for (PieItem inner : mOpenItem.getItems()) { - drawItem(canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1); + if (mFadeOut != null) { + drawItem(canvas, inner, alpha); + } else { + drawItem(canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1); + } } } canvas.restoreToCount(state); @@ -404,12 +424,20 @@ public class PieRenderer extends OverlayRenderer int state = canvas.save(); float r = getDegrees(item.getStartAngle()); canvas.rotate(r, mCenter.x, mCenter.y); + if (mFadeOut != null) { + p.setAlpha((int)(255 * alpha)); + } canvas.drawPath(item.getPath(), p); + if (mFadeOut != null) { + p.setAlpha(255); + } canvas.restoreToCount(state); } - alpha = alpha * (item.isEnabled() ? 1 : 0.3f); - // draw the item view - item.setAlpha(alpha); + if (mFadeOut == null) { + alpha = alpha * (item.isEnabled() ? 1 : 0.3f); + // draw the item view + item.setAlpha(alpha); + } item.draw(canvas); } } @@ -451,8 +479,7 @@ public class PieRenderer extends OverlayRenderer show(false); } else if (!mOpening && !item.hasItems()) { - item.performClick(); - startFadeOut(); + startFadeOut(item); mTapMode = false; } return true; @@ -527,6 +554,9 @@ public class PieRenderer extends OverlayRenderer mCurrentItem.setSelected(false); mOpenItem = mCurrentItem; mOpening = true; + if (mFadeIn != null) { + mFadeIn.cancel(); + } mXFade = new LinearAnimation(1, 0); mXFade.setDuration(PIE_XFADE_DURATION); mXFade.setAnimationListener(new AnimationListener() { @@ -780,6 +810,26 @@ public class PieRenderer extends OverlayRenderer } } + private class FadeOutAnimation extends Animation { + + private float mAlpha; + + public float getValue() { + return mAlpha; + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + if (interpolatedTime < 0.2) { + mAlpha = 1; + } else if (interpolatedTime < 0.3) { + mAlpha = 0; + } else { + mAlpha = 1 - (interpolatedTime - 0.3f) / 0.7f; + } + } + } + private class ScaleAnimation extends Animation { private float mFrom = 1f; private float mTo = 1f; -- cgit v1.2.3