diff --git a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml index 28875184ab..b2957aad64 100644 --- a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml +++ b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml @@ -42,8 +42,6 @@ android:id="@+id/gesture_tutorial_fake_previous_task_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:scaleX="0.98" - android:scaleY="0.98" android:visibility="invisible"> animations = new ArrayList<>(); // center view animations.add(ObjectAnimator.ofFloat(this, TRANSLATION_X, 0)); - // calculate full screen scaling, scale should be 1:1 for x and y + // retrieve start animation matrix to scale off of Matrix matrix = getAnimationMatrix(); + if (matrix == null) { + // This is an illegal state. + return; + } + float[] matrixValues = new float[9]; matrix.getValues(matrixValues); - float scaleX = matrixValues[Matrix.MSCALE_X]; - float scaleToFullScreen = 1 / scaleX; + float[] newValues = matrixValues.clone(); - // scale view to full screen - ValueAnimator scale = ValueAnimator.ofFloat(1f, scaleToFullScreen); - scale.addUpdateListener(animation -> { - float value = (float) animation.getAnimatedValue(); - mFullTaskView.setScaleX(value); - mFullTaskView.setScaleY(value); - }); + ValueAnimator transformAnimation = ValueAnimator.ofFloat(0, 1); - animations.add(scale); + MultiValueUpdateListener listener = new MultiValueUpdateListener() { + Matrix currentMatrix = new Matrix(); + + FloatProp mOutlineRadius = new FloatProp(outlineStartRadius, outlineEndRadius, 0, + ANIMATE_TO_FULL_SCREEN_DURATION, LINEAR); + FloatProp mTransX = new FloatProp(matrixValues[Matrix.MTRANS_X], 0f, 0, + ANIMATE_TO_FULL_SCREEN_DURATION, LINEAR); + FloatProp mTransY = new FloatProp(matrixValues[Matrix.MTRANS_Y], 0f, 0, + ANIMATE_TO_FULL_SCREEN_DURATION, LINEAR); + FloatProp mScaleX = new FloatProp(matrixValues[Matrix.MSCALE_X], 1f, 0, + ANIMATE_TO_FULL_SCREEN_DURATION, LINEAR); + FloatProp mScaleY = new FloatProp(matrixValues[Matrix.MSCALE_Y], 1f, 0, + ANIMATE_TO_FULL_SCREEN_DURATION, LINEAR); + + @Override + public void onUpdate(float percent, boolean initOnly) { + // scale corner radius to match display radius + mTaskViewAnimatedRadius = mOutlineRadius.value; + mFullTaskView.invalidateOutline(); + + // translate to center, ends at translation x:0, y:0 + newValues[Matrix.MTRANS_X] = mTransX.value; + newValues[Matrix.MTRANS_Y] = mTransY.value; + + // scale to full size, ends at scale 1 + newValues[Matrix.MSCALE_X] = mScaleX.value; + newValues[Matrix.MSCALE_Y] = mScaleY.value; + + // create and set new animation matrix + currentMatrix.setValues(newValues); + setAnimationMatrix(currentMatrix); + } + }; + + transformAnimation.addUpdateListener(listener); + animations.add(transformAnimation); set.playSequentially(animations); - set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + super.onAnimationStart(animation); + addAnimatedOutlineProvider(mFullTaskView, outlineStartRect, outlineStartRadius); + } + @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); @@ -127,7 +192,6 @@ public class AnimatedTaskView extends ConstraintLayout { } } }); - set.start(); } @@ -158,17 +222,7 @@ public class AnimatedTaskView extends ConstraintLayout { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); - - mTaskViewAnimatedRect.set(outlineStartRect); - mTaskViewAnimatedRadius = outlineStartRadius; - - mFullTaskView.setClipToOutline(true); - mFullTaskView.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setRoundRect(mTaskViewAnimatedRect, mTaskViewAnimatedRadius); - } - }); + addAnimatedOutlineProvider(mFullTaskView, outlineStartRect, outlineStartRadius); } @Override @@ -247,4 +301,17 @@ public class AnimatedTaskView extends ConstraintLayout { mTaskViewOutlineProvider = provider; mFullTaskView.setOutlineProvider(mTaskViewOutlineProvider); } + + private void addAnimatedOutlineProvider(View view, + Rect outlineStartRect, float outlineStartRadius){ + mTaskViewAnimatedRect.set(outlineStartRect); + mTaskViewAnimatedRadius = outlineStartRadius; + view.setClipToOutline(true); + view.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(mTaskViewAnimatedRect, mTaskViewAnimatedRadius); + } + }); + } }