From 848bd7088347e771a8b1bd93534480223d262c5e Mon Sep 17 00:00:00 2001 From: Likai Ding Date: Wed, 10 Jun 2015 14:50:19 +0800 Subject: SnapdragonCamera: limit AF animation FPS Currently AF animation depends on RenderOverlay's onDraw() method and is called at default 60 FPS. Switch to ValueAnimator and invalidates RenderOverlay at given FPS. Change-Id: I9cff5d6e99bb7f8ecd579c7935a092f8feba341c CRs-Fixed: 846169 --- src/com/android/camera/ui/PieRenderer.java | 88 +++++++++++++++--------------- 1 file changed, 43 insertions(+), 45 deletions(-) (limited to 'src/com/android/camera/ui/PieRenderer.java') diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java index 324e0fe98..3712de1b7 100644 --- a/src/com/android/camera/ui/PieRenderer.java +++ b/src/com/android/camera/ui/PieRenderer.java @@ -56,16 +56,16 @@ public class PieRenderer extends OverlayRenderer // These states are used to make sure the animation is run for at least some // time. private volatile int mState; - private ScaleAnimation mAnimation = new ScaleAnimation(); + private ValueAnimator mAnimator; private static final int STATE_IDLE = 0; private static final int STATE_FOCUSING = 1; private static final int STATE_FINISHING = 2; private static final int STATE_PIE = 8; + private static final int FPS = 30; private static final float MATH_PI_2 = (float)(Math.PI / 2); private Runnable mDisappear = new Disappear(); - private Animation.AnimationListener mEndAction = new EndAction(); private static final int SCALING_UP_TIME = 600; private static final int SCALING_DOWN_TIME = 100; private static final int DISAPPEAR_TIMEOUT = 200; @@ -1022,8 +1022,8 @@ public class PieRenderer extends OverlayRenderer private void cancelFocus() { mFocusCancelled = true; mOverlay.removeCallbacks(mDisappear); - if (mAnimation != null && !mAnimation.hasEnded()) { - mAnimation.cancel(); + if (mAnimator != null && mAnimator.isStarted()) { + mAnimator.cancel(); } mFocusCancelled = false; mFocused = false; @@ -1059,33 +1059,51 @@ public class PieRenderer extends OverlayRenderer toScale); } - private void startAnimation(long duration, boolean timeout, + private void startAnimation(long duration, final boolean timeout, float fromScale, float toScale) { setVisible(true); - mAnimation.reset(); - mAnimation.setDuration(duration); - mAnimation.setScale(fromScale, toScale); - mAnimation.setAnimationListener(timeout ? mEndAction : null); - mOverlay.startAnimation(mAnimation); - update(); - } - private class EndAction implements Animation.AnimationListener { - @Override - public void onAnimationEnd(Animation animation) { - // Keep the focus indicator for some time. - if (!mFocusCancelled) { - mOverlay.postDelayed(mDisappear, DISAPPEAR_TIMEOUT); + if (mAnimator != null) mAnimator.cancel(); + + mAnimator = ValueAnimator.ofFloat(fromScale, toScale); + mAnimator.setDuration(duration); + mAnimator.setInterpolator(null); + mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + private long frames; + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + long now = animation.getCurrentPlayTime(); + if (frames < animation.getCurrentPlayTime() * FPS / 1000) { + update(); + ++frames; + mDialAngle = Math.round((Float) animation.getAnimatedValue()); + } + } + }); + mAnimator.addListener(new AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { } - } - @Override - public void onAnimationRepeat(Animation animation) { - } + @Override + public void onAnimationEnd(Animator animation) { + if (timeout && !mFocusCancelled) { + mOverlay.postDelayed(mDisappear, DISAPPEAR_TIMEOUT); + } + } - @Override - public void onAnimationStart(Animation animation) { - } + @Override + public void onAnimationRepeat(Animator animation) { + } + + @Override + public void onAnimationCancel(Animator arg0) { + } + }); + mAnimator.start(); + + update(); } private class Disappear implements Runnable { @@ -1100,24 +1118,4 @@ public class PieRenderer extends OverlayRenderer mFocused = false; } } - - private class ScaleAnimation extends Animation { - private float mFrom = 1f; - private float mTo = 1f; - - public ScaleAnimation() { - setFillAfter(true); - } - - public void setScale(float from, float to) { - mFrom = from; - mTo = to; - } - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - mDialAngle = (int)(mFrom + (mTo - mFrom) * interpolatedTime); - } - } - } -- cgit v1.2.3