Merge "Fix jank in CUJ_NOTIFICATION_HEADS_UP_APPEAR" into tm-qpr-dev am: f71427b27e
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20789485 Change-Id: I3314f2e642cbd34a2ef63dfd9c932f5c289a9b59 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -24,6 +24,7 @@ import android.graphics.Canvas;
|
|||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.MathUtils;
|
import android.util.MathUtils;
|
||||||
|
import android.view.Choreographer;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
@@ -492,12 +493,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
if (animationListener != null) {
|
if (animationListener != null) {
|
||||||
mAppearAnimator.addListener(animationListener);
|
mAppearAnimator.addListener(animationListener);
|
||||||
}
|
}
|
||||||
if (delay > 0) {
|
// we need to apply the initial state already to avoid drawn frames in the wrong state
|
||||||
// we need to apply the initial state already to avoid drawn frames in the wrong state
|
updateAppearAnimationAlpha();
|
||||||
updateAppearAnimationAlpha();
|
updateAppearRect();
|
||||||
updateAppearRect();
|
|
||||||
mAppearAnimator.setStartDelay(delay);
|
|
||||||
}
|
|
||||||
mAppearAnimator.addListener(new AnimatorListenerAdapter() {
|
mAppearAnimator.addListener(new AnimatorListenerAdapter() {
|
||||||
private boolean mWasCancelled;
|
private boolean mWasCancelled;
|
||||||
|
|
||||||
@@ -528,7 +526,20 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
mWasCancelled = true;
|
mWasCancelled = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mAppearAnimator.start();
|
|
||||||
|
// Cache the original animator so we can check if the animation should be started in the
|
||||||
|
// Choreographer callback. It's possible that the original animator (mAppearAnimator) is
|
||||||
|
// replaced with a new value before the callback is called.
|
||||||
|
ValueAnimator cachedAnimator = mAppearAnimator;
|
||||||
|
// Even when delay=0, starting the animation on the next frame is necessary to avoid jank.
|
||||||
|
// Not doing so will increase the chances our Animator will be forced to skip a value of
|
||||||
|
// the animation's progression, causing stutter.
|
||||||
|
Choreographer.getInstance().postFrameCallbackDelayed(
|
||||||
|
frameTimeNanos -> {
|
||||||
|
if (mAppearAnimator == cachedAnimator) {
|
||||||
|
mAppearAnimator.start();
|
||||||
|
}
|
||||||
|
}, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getCujType(boolean isAppearing) {
|
private int getCujType(boolean isAppearing) {
|
||||||
|
|||||||
Reference in New Issue
Block a user