Moved the circle finishing animation to the RenderThread
Now the preview clipper animation and our own circle drawing are in sync again when launching an affordance! Bug: 21440634 Change-Id: I96cda04926fb9ae62db6690ddebaf73df38e9ca9
This commit is contained in:
@@ -23,11 +23,14 @@ import android.animation.PropertyValuesHolder;
|
|||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.CanvasProperty;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.view.DisplayListCanvas;
|
||||||
|
import android.view.RenderNodeAnimator;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewAnimationUtils;
|
import android.view.ViewAnimationUtils;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
@@ -35,6 +38,7 @@ import android.view.animation.Interpolator;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardAffordanceHelper;
|
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
|
* An ImageView which does not have overlapping renderings commands and therefore does not need a
|
||||||
@@ -77,6 +81,14 @@ public class KeyguardAffordanceView extends ImageView {
|
|||||||
private float mMaxCircleSize;
|
private float mMaxCircleSize;
|
||||||
private Animator mPreviewClipper;
|
private Animator mPreviewClipper;
|
||||||
private float mRestingAlpha = KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT;
|
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() {
|
private AnimatorListenerAdapter mClipEndListener = new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation) {
|
public void onAnimationEnd(Animator animation) {
|
||||||
@@ -155,6 +167,7 @@ public class KeyguardAffordanceView extends ImageView {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
|
mSupportHardware = canvas.isHardwareAccelerated();
|
||||||
drawBackgroundCircle(canvas);
|
drawBackgroundCircle(canvas);
|
||||||
drawArrow(canvas);
|
drawArrow(canvas);
|
||||||
canvas.save();
|
canvas.save();
|
||||||
@@ -196,8 +209,14 @@ public class KeyguardAffordanceView extends ImageView {
|
|||||||
|
|
||||||
private void drawBackgroundCircle(Canvas canvas) {
|
private void drawBackgroundCircle(Canvas canvas) {
|
||||||
if (mCircleRadius > 0) {
|
if (mCircleRadius > 0) {
|
||||||
updateCircleColor();
|
if (mFinishing && mSupportHardware) {
|
||||||
canvas.drawCircle(mCenterX, mCenterY, mCircleRadius, mCirclePaint);
|
DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
|
||||||
|
displayListCanvas.drawCircle(mHwCenterX, mHwCenterY, mHwCircleRadius,
|
||||||
|
mHwCirclePaint);
|
||||||
|
} else {
|
||||||
|
updateCircleColor();
|
||||||
|
canvas.drawCircle(mCenterX, mCenterY, mCircleRadius, mCirclePaint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,15 +237,23 @@ public class KeyguardAffordanceView extends ImageView {
|
|||||||
public void finishAnimation(float velocity, final Runnable mAnimationEndRunnable) {
|
public void finishAnimation(float velocity, final Runnable mAnimationEndRunnable) {
|
||||||
cancelAnimator(mCircleAnimator);
|
cancelAnimator(mCircleAnimator);
|
||||||
cancelAnimator(mPreviewClipper);
|
cancelAnimator(mPreviewClipper);
|
||||||
|
mFinishing = true;
|
||||||
mCircleStartRadius = mCircleRadius;
|
mCircleStartRadius = mCircleRadius;
|
||||||
float maxCircleSize = getMaxCircleSize();
|
float maxCircleSize = getMaxCircleSize();
|
||||||
ValueAnimator animatorToRadius = getAnimatorToRadius(maxCircleSize);
|
Animator animatorToRadius;
|
||||||
|
if (mSupportHardware) {
|
||||||
|
initHwProperties();
|
||||||
|
animatorToRadius = getRtAnimatorToRadius(maxCircleSize);
|
||||||
|
} else {
|
||||||
|
animatorToRadius = getAnimatorToRadius(maxCircleSize);
|
||||||
|
}
|
||||||
mFlingAnimationUtils.applyDismissing(animatorToRadius, mCircleRadius, maxCircleSize,
|
mFlingAnimationUtils.applyDismissing(animatorToRadius, mCircleRadius, maxCircleSize,
|
||||||
velocity, maxCircleSize);
|
velocity, maxCircleSize);
|
||||||
animatorToRadius.addListener(new AnimatorListenerAdapter() {
|
animatorToRadius.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation) {
|
public void onAnimationEnd(Animator animation) {
|
||||||
mAnimationEndRunnable.run();
|
mAnimationEndRunnable.run();
|
||||||
|
mFinishing = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
animatorToRadius.start();
|
animatorToRadius.start();
|
||||||
@@ -240,9 +267,34 @@ public class KeyguardAffordanceView extends ImageView {
|
|||||||
velocity, maxCircleSize);
|
velocity, maxCircleSize);
|
||||||
mPreviewClipper.addListener(mClipEndListener);
|
mPreviewClipper.addListener(mClipEndListener);
|
||||||
mPreviewClipper.start();
|
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() {
|
private float getMaxCircleSize() {
|
||||||
getLocationInWindow(mTempPoint);
|
getLocationInWindow(mTempPoint);
|
||||||
float rootWidth = getRootView().getWidth();
|
float rootWidth = getRootView().getWidth();
|
||||||
|
|||||||
Reference in New Issue
Block a user