From c879dbf7646b244c32df99ad0f04c0e4e67af2ba Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 16 Apr 2018 16:31:07 -0700 Subject: [PATCH] Animate thumbnail dim after quick scrub settles We now animate the dim alpha at the same time as the task icon. I also clarified the dim alpha by inverting it where it is used in TaskThumbnailView. Otherwise, we have to pass 1 - dimAlpha everywhere, which is confusing and verbose. Bug: 76170043 Change-Id: If8c01300993a0e5543b0650d44daaa143592b96e (cherry picked from commit 291bfd9c952de61290fd5fed81947aeeeb6eaeeb) --- .../android/quickstep/views/RecentsView.java | 4 +-- .../quickstep/views/TaskThumbnailView.java | 19 +++++++++++- .../com/android/quickstep/views/TaskView.java | 29 +++++++++++++++++-- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 2e70e45da1..597e33368e 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -630,9 +630,9 @@ public abstract class RecentsView TaskView firstTask = (TaskView) getChildAt(0); if (firstTask != null) { if (animate) { - firstTask.animateIconToScale(scale); + firstTask.animateIconToScaleAndDim(scale); } else { - firstTask.setIconScale(scale); + firstTask.setIconScaleAndDim(scale); } } } diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index 326eb9f093..6473d1645b 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -28,6 +28,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; +import android.util.FloatProperty; +import android.util.Property; import android.view.View; import com.android.launcher3.BaseActivity; @@ -46,6 +48,19 @@ public class TaskThumbnailView extends View { private static final LightingColorFilter[] sDimFilterCache = new LightingColorFilter[256]; + public static final Property DIM_ALPHA = + new FloatProperty("dimAlpha") { + @Override + public void setValue(TaskThumbnailView thumbnail, float dimAlpha) { + thumbnail.setDimAlpha(dimAlpha); + } + + @Override + public Float get(TaskThumbnailView thumbnailView) { + return thumbnailView.mDimAlpha; + } + }; + private final float mCornerRadius; private final BaseActivity mActivity; @@ -111,6 +126,8 @@ public class TaskThumbnailView extends View { /** * Sets the alpha of the dim layer on top of this view. + * + * If dimAlpha is 0, no dimming is applied; if dimAlpha is 1, the thumbnail will be black. */ public void setDimAlpha(float dimAlpha) { mDimAlpha = dimAlpha; @@ -149,7 +166,7 @@ public class TaskThumbnailView extends View { } private void updateThumbnailPaintFilter() { - int mul = (int) (mDimAlpha * 255); + int mul = (int) ((1 - mDimAlpha) * 255); if (mBitmapShader != null) { LightingColorFilter filter = getLightingColorFilter(mul); mPaint.setColorFilter(filter); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index f04acaf12e..2c1318c481 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -16,6 +16,11 @@ package com.android.quickstep.views; +import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.ActivityOptions; import android.content.Context; @@ -75,6 +80,8 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback private TaskThumbnailView mSnapshotView; private ImageView mIconView; private float mCurveScale; + private float mCurveDimAlpha; + private Animator mDimAlphaAnim; public TaskView(Context context) { this(context, null); @@ -166,14 +173,27 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback // Do nothing } - public void animateIconToScale(float scale) { + public void animateIconToScaleAndDim(float scale) { mIconView.animate().scaleX(scale).scaleY(scale).setDuration(SCALE_ICON_DURATION).start(); + mDimAlphaAnim = ObjectAnimator.ofFloat(mSnapshotView, DIM_ALPHA, scale * mCurveDimAlpha); + mDimAlphaAnim.setDuration(SCALE_ICON_DURATION); + mDimAlphaAnim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mDimAlphaAnim = null; + } + }); + mDimAlphaAnim.start(); } - protected void setIconScale(float iconScale) { + protected void setIconScaleAndDim(float iconScale) { mIconView.animate().cancel(); mIconView.setScaleX(iconScale); mIconView.setScaleY(iconScale); + if (mDimAlphaAnim != null) { + mDimAlphaAnim.cancel(); + } + mSnapshotView.setDimAlpha(iconScale * mCurveDimAlpha); } public void resetVisualProperties() { @@ -190,7 +210,10 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback float curveInterpolation = CURVE_INTERPOLATOR.getInterpolation(scrollState.linearInterpolation); - mSnapshotView.setDimAlpha(1 - curveInterpolation * MAX_PAGE_SCRIM_ALPHA); + mCurveDimAlpha = curveInterpolation * MAX_PAGE_SCRIM_ALPHA; + if (mDimAlphaAnim == null && mIconView.getScaleX() > 0) { + mSnapshotView.setDimAlpha(mCurveDimAlpha); + } mCurveScale = 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR; setScaleX(mCurveScale);