Merge "Set starting frame to startTransaction for ActivityEmbedding transition"

This commit is contained in:
Chris Li
2023-02-10 01:56:53 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 11 deletions

View File

@@ -22,7 +22,6 @@ import static android.graphics.Matrix.MTRANS_Y;
import android.annotation.CallSuper;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.Choreographer;
import android.view.SurfaceControl;
import android.view.animation.Animation;
import android.view.animation.Transformation;
@@ -71,7 +70,6 @@ class ActivityEmbeddingAnimationAdapter {
final float[] mVecs = new float[4];
@NonNull
final Rect mRect = new Rect();
private boolean mIsFirstFrame = true;
private int mOverrideLayer = LAYER_NO_OVERRIDE;
ActivityEmbeddingAnimationAdapter(@NonNull Animation animation,
@@ -117,20 +115,21 @@ class ActivityEmbeddingAnimationAdapter {
mOverrideLayer = layer;
}
/** Called to prepare for the starting state. */
final void prepareForFirstFrame(@NonNull SurfaceControl.Transaction startTransaction) {
startTransaction.show(mLeash);
if (mOverrideLayer != LAYER_NO_OVERRIDE) {
startTransaction.setLayer(mLeash, mOverrideLayer);
}
mAnimation.getTransformationAt(0, mTransformation);
onAnimationUpdateInner(startTransaction);
}
/** Called on frame update. */
final void onAnimationUpdate(@NonNull SurfaceControl.Transaction t, long currentPlayTime) {
if (mIsFirstFrame) {
t.show(mLeash);
if (mOverrideLayer != LAYER_NO_OVERRIDE) {
t.setLayer(mLeash, mOverrideLayer);
}
mIsFirstFrame = false;
}
// Extract the transformation to the current time.
mAnimation.getTransformation(Math.min(currentPlayTime, mAnimation.getDuration()),
mTransformation);
t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
onAnimationUpdateInner(t);
}

View File

@@ -32,6 +32,7 @@ import android.graphics.Rect;
import android.os.IBinder;
import android.util.ArraySet;
import android.util.Log;
import android.view.Choreographer;
import android.view.SurfaceControl;
import android.view.animation.Animation;
import android.window.TransitionInfo;
@@ -130,11 +131,13 @@ class ActivityEmbeddingAnimationRunner {
animator.addUpdateListener((anim) -> {
// Update all adapters in the same transaction.
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
for (ActivityEmbeddingAnimationAdapter adapter : adapters) {
adapter.onAnimationUpdate(t, animator.getCurrentPlayTime());
}
t.apply();
});
prepareForFirstFrame(startTransaction, adapters);
}
animator.setDuration(duration);
animator.addListener(new Animator.AnimatorListener() {
@@ -248,6 +251,15 @@ class ActivityEmbeddingAnimationRunner {
return adapters;
}
/** Sets the first frame to the {@code startTransaction} to avoid any flicker on start. */
private void prepareForFirstFrame(@NonNull SurfaceControl.Transaction startTransaction,
@NonNull List<ActivityEmbeddingAnimationAdapter> adapters) {
startTransaction.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
for (ActivityEmbeddingAnimationAdapter adapter : adapters) {
adapter.prepareForFirstFrame(startTransaction);
}
}
/** Adds edge extension to the surfaces that have such an animation property. */
private void addEdgeExtensionIfNeeded(@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,