Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +55 −3 Original line number Diff line number Diff line Loading @@ -23,11 +23,14 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.CanvasProperty; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.DisplayListCanvas; import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewAnimationUtils; import android.view.animation.AnimationUtils; Loading @@ -35,6 +38,7 @@ import android.view.animation.Interpolator; import android.widget.ImageView; import com.android.systemui.R; import com.android.systemui.statusbar.phone.KeyguardAffordanceHelper; import com.android.systemui.statusbar.phone.PhoneStatusBar; /** * An ImageView which does not have overlapping renderings commands and therefore does not need a Loading Loading @@ -77,6 +81,14 @@ public class KeyguardAffordanceView extends ImageView { private float mMaxCircleSize; private Animator mPreviewClipper; private float mRestingAlpha = KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT; private boolean mSupportHardware; private boolean mFinishing; private CanvasProperty<Float> mHwCircleRadius; private CanvasProperty<Float> mHwCenterX; private CanvasProperty<Float> mHwCenterY; private CanvasProperty<Paint> mHwCirclePaint; private AnimatorListenerAdapter mClipEndListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { Loading Loading @@ -155,6 +167,7 @@ public class KeyguardAffordanceView extends ImageView { @Override protected void onDraw(Canvas canvas) { mSupportHardware = canvas.isHardwareAccelerated(); drawBackgroundCircle(canvas); drawArrow(canvas); canvas.save(); Loading Loading @@ -196,10 +209,16 @@ public class KeyguardAffordanceView extends ImageView { private void drawBackgroundCircle(Canvas canvas) { if (mCircleRadius > 0) { if (mFinishing && mSupportHardware) { DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; displayListCanvas.drawCircle(mHwCenterX, mHwCenterY, mHwCircleRadius, mHwCirclePaint); } else { updateCircleColor(); canvas.drawCircle(mCenterX, mCenterY, mCircleRadius, mCirclePaint); } } } private void updateCircleColor() { float fraction = 0.5f + 0.5f * Math.max(0.0f, Math.min(1.0f, Loading @@ -218,15 +237,23 @@ public class KeyguardAffordanceView extends ImageView { public void finishAnimation(float velocity, final Runnable mAnimationEndRunnable) { cancelAnimator(mCircleAnimator); cancelAnimator(mPreviewClipper); mFinishing = true; mCircleStartRadius = mCircleRadius; float maxCircleSize = getMaxCircleSize(); ValueAnimator animatorToRadius = getAnimatorToRadius(maxCircleSize); Animator animatorToRadius; if (mSupportHardware) { initHwProperties(); animatorToRadius = getRtAnimatorToRadius(maxCircleSize); } else { animatorToRadius = getAnimatorToRadius(maxCircleSize); } mFlingAnimationUtils.applyDismissing(animatorToRadius, mCircleRadius, maxCircleSize, velocity, maxCircleSize); animatorToRadius.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mAnimationEndRunnable.run(); mFinishing = false; } }); animatorToRadius.start(); Loading @@ -240,7 +267,32 @@ public class KeyguardAffordanceView extends ImageView { velocity, maxCircleSize); mPreviewClipper.addListener(mClipEndListener); mPreviewClipper.start(); if (mSupportHardware) { startRtCircleFadeOut(animatorToRadius.getDuration()); } } } private void startRtCircleFadeOut(long duration) { RenderNodeAnimator animator = new RenderNodeAnimator(mHwCirclePaint, RenderNodeAnimator.PAINT_ALPHA, 0); animator.setDuration(duration); animator.setInterpolator(PhoneStatusBar.ALPHA_OUT); animator.setTarget(this); animator.start(); } private Animator getRtAnimatorToRadius(float circleRadius) { RenderNodeAnimator animator = new RenderNodeAnimator(mHwCircleRadius, circleRadius); animator.setTarget(this); return animator; } private void initHwProperties() { mHwCenterX = CanvasProperty.createFloat(mCenterX); mHwCenterY = CanvasProperty.createFloat(mCenterY); mHwCirclePaint = CanvasProperty.createPaint(mCirclePaint); mHwCircleRadius = CanvasProperty.createFloat(mCircleRadius); } private float getMaxCircleSize() { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +55 −3 Original line number Diff line number Diff line Loading @@ -23,11 +23,14 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.CanvasProperty; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.DisplayListCanvas; import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewAnimationUtils; import android.view.animation.AnimationUtils; Loading @@ -35,6 +38,7 @@ import android.view.animation.Interpolator; import android.widget.ImageView; import com.android.systemui.R; import com.android.systemui.statusbar.phone.KeyguardAffordanceHelper; import com.android.systemui.statusbar.phone.PhoneStatusBar; /** * An ImageView which does not have overlapping renderings commands and therefore does not need a Loading Loading @@ -77,6 +81,14 @@ public class KeyguardAffordanceView extends ImageView { private float mMaxCircleSize; private Animator mPreviewClipper; private float mRestingAlpha = KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT; private boolean mSupportHardware; private boolean mFinishing; private CanvasProperty<Float> mHwCircleRadius; private CanvasProperty<Float> mHwCenterX; private CanvasProperty<Float> mHwCenterY; private CanvasProperty<Paint> mHwCirclePaint; private AnimatorListenerAdapter mClipEndListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { Loading Loading @@ -155,6 +167,7 @@ public class KeyguardAffordanceView extends ImageView { @Override protected void onDraw(Canvas canvas) { mSupportHardware = canvas.isHardwareAccelerated(); drawBackgroundCircle(canvas); drawArrow(canvas); canvas.save(); Loading Loading @@ -196,10 +209,16 @@ public class KeyguardAffordanceView extends ImageView { private void drawBackgroundCircle(Canvas canvas) { if (mCircleRadius > 0) { if (mFinishing && mSupportHardware) { DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; displayListCanvas.drawCircle(mHwCenterX, mHwCenterY, mHwCircleRadius, mHwCirclePaint); } else { updateCircleColor(); canvas.drawCircle(mCenterX, mCenterY, mCircleRadius, mCirclePaint); } } } private void updateCircleColor() { float fraction = 0.5f + 0.5f * Math.max(0.0f, Math.min(1.0f, Loading @@ -218,15 +237,23 @@ public class KeyguardAffordanceView extends ImageView { public void finishAnimation(float velocity, final Runnable mAnimationEndRunnable) { cancelAnimator(mCircleAnimator); cancelAnimator(mPreviewClipper); mFinishing = true; mCircleStartRadius = mCircleRadius; float maxCircleSize = getMaxCircleSize(); ValueAnimator animatorToRadius = getAnimatorToRadius(maxCircleSize); Animator animatorToRadius; if (mSupportHardware) { initHwProperties(); animatorToRadius = getRtAnimatorToRadius(maxCircleSize); } else { animatorToRadius = getAnimatorToRadius(maxCircleSize); } mFlingAnimationUtils.applyDismissing(animatorToRadius, mCircleRadius, maxCircleSize, velocity, maxCircleSize); animatorToRadius.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mAnimationEndRunnable.run(); mFinishing = false; } }); animatorToRadius.start(); Loading @@ -240,7 +267,32 @@ public class KeyguardAffordanceView extends ImageView { velocity, maxCircleSize); mPreviewClipper.addListener(mClipEndListener); mPreviewClipper.start(); if (mSupportHardware) { startRtCircleFadeOut(animatorToRadius.getDuration()); } } } private void startRtCircleFadeOut(long duration) { RenderNodeAnimator animator = new RenderNodeAnimator(mHwCirclePaint, RenderNodeAnimator.PAINT_ALPHA, 0); animator.setDuration(duration); animator.setInterpolator(PhoneStatusBar.ALPHA_OUT); animator.setTarget(this); animator.start(); } private Animator getRtAnimatorToRadius(float circleRadius) { RenderNodeAnimator animator = new RenderNodeAnimator(mHwCircleRadius, circleRadius); animator.setTarget(this); return animator; } private void initHwProperties() { mHwCenterX = CanvasProperty.createFloat(mCenterX); mHwCenterY = CanvasProperty.createFloat(mCenterY); mHwCirclePaint = CanvasProperty.createPaint(mCirclePaint); mHwCircleRadius = CanvasProperty.createFloat(mCircleRadius); } private float getMaxCircleSize() { Loading