Smoother folder animation tweaks.

1. Start preview item animations later opening
2. Finish item animations sooner when closing
3. 1 & 2 allow the preview items to move as part of
   the Folder and allows for a smoother animation
4. Remove setCurrentPlayTime as it is O API.

Bug: 36522198
Bug: 35064148
Change-Id: If63d4d032078ff4e28b72a09e35da3a71f1d0e27
This commit is contained in:
Jon Miranda
2017-03-23 10:17:55 -07:00
parent 0eb6326b5f
commit ce74d2a813
4 changed files with 54 additions and 13 deletions

View File

@@ -64,6 +64,9 @@ public class FolderAnimationManager {
private final boolean mIsOpening;
private final int mDuration;
private final int mDelay;
private final TimeInterpolator mOpeningInterpolator;
private final TimeInterpolator mClosingInterpolator;
private final TimeInterpolator mPreviewItemOpeningInterpolator;
@@ -116,6 +119,9 @@ public class FolderAnimationManager {
mIsOpening = isOpening;
mDuration = mFolder.mMaterialExpandDuration;
mDelay = mContext.getResources().getInteger(R.integer.config_folderDelay);
mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.folder_opening_interpolator);
mClosingInterpolator = AnimationUtils.loadInterpolator(mContext,
@@ -194,14 +200,13 @@ public class FolderAnimationManager {
// Create the animators.
AnimatorSet a = LauncherAnimUtils.createAnimatorSet();
a.setDuration(mFolder.mMaterialExpandDuration);
a.play(getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f));
a.play(getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f));
a.play(getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale));
a.play(getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor));
a.play(getAnimator(mFolderBackground, "color", initialColor, finalColor));
a.play(new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect,
play(a, getAnimator(mFolder, View.TRANSLATION_X, xDistance, 0f));
play(a, getAnimator(mFolder, View.TRANSLATION_Y, yDistance, 0f));
play(a, getAnimator(mFolder, SCALE_PROPERTY, initialScale, finalScale));
play(a, getAnimator(items, ITEMS_TEXT_COLOR_PROPERTY, Color.TRANSPARENT, finalTextColor));
play(a, getAnimator(mFolderBackground, "color", initialColor, finalColor));
play(a, new RoundedRectRevealOutlineProvider(initialSize / 2f, finalRadius, startRect,
endRect).createRevealAnimator(mFolder, !mIsOpening));
a.addListener(new AnimatorListenerAdapter() {
@@ -272,17 +277,42 @@ public class FolderAnimationManager {
Animator translationX = getAnimator(btv, View.TRANSLATION_X, xDistance, 0f);
translationX.setInterpolator(previewItemInterpolator);
animatorSet.play(translationX);
play(animatorSet, translationX);
Animator translationY = getAnimator(btv, View.TRANSLATION_Y, yDistance, 0f);
translationY.setInterpolator(previewItemInterpolator);
animatorSet.play(translationY);
play(animatorSet, translationY);
Animator scaleAnimator = getAnimator(btv, SCALE_PROPERTY, initialScale, finalScale);
scaleAnimator.setInterpolator(previewItemInterpolator);
animatorSet.play(scaleAnimator);
play(animatorSet, scaleAnimator);
if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) {
// These delays allows the preview items to move as part of the Folder's motion,
// and its only necessary for large folders because of differing interpolators.
if (mIsOpening) {
translationX.setStartDelay(mDelay);
translationY.setStartDelay(mDelay);
scaleAnimator.setStartDelay(mDelay);
}
translationX.setDuration(translationX.getDuration() - mDelay);
translationY.setDuration(translationY.getDuration() - mDelay);
scaleAnimator.setDuration(scaleAnimator.getDuration() - mDelay);
}
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
// Necessary to initialize values here because of the start delay.
if (mIsOpening) {
btv.setTranslationX(xDistance);
btv.setTranslationY(yDistance);
btv.setScaleX(initialScale);
btv.setScaleY(initialScale);
}
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
@@ -295,6 +325,11 @@ public class FolderAnimationManager {
}
}
private void play(AnimatorSet as, Animator a) {
a.setDuration(mDuration);
as.play(a);
}
private TimeInterpolator getPreviewItemInterpolator() {
if (mFolder.getItemCount() > FolderIcon.NUM_ITEMS_IN_PREVIEW) {
// With larger folders, we want the preview items to reach their final positions faster