Folder animation polish.

* Use different interpolators so that the prevew items in large folders
  appear aligned with the rest of the folder contents longer (the
  preview item movements are less jumpy).
* Fixed animation elevation on close.

Bug: 63131666
Bug: 35064148
Change-Id: Iecb1a8d3105e630ee00b3ea4b692979efb928d7d
This commit is contained in:
Jon Miranda 2017-06-29 09:20:20 -07:00
parent 985cfe9ee4
commit de0ea81442
3 changed files with 47 additions and 18 deletions

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2017, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.3"
android:controlY1="0"
android:controlX2="1"
android:controlY2="1"/>

View File

@ -20,5 +20,5 @@
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0"
android:controlY1="1"
android:controlX2="0"
android:controlX2="0.5"
android:controlY2="1"/>

View File

@ -69,7 +69,8 @@ public class FolderAnimationManager {
private final int mDelay;
private final TimeInterpolator mFolderInterpolator;
private final TimeInterpolator mLargeFolderPreviewItemInterpolator;
private final TimeInterpolator mLargeFolderPreviewItemOpenInterpolator;
private final TimeInterpolator mLargeFolderPreviewItemCloseInterpolator;
private final PreviewItemDrawingParams mTmpParams = new PreviewItemDrawingParams(0, 0, 0, 0);
@ -105,8 +106,10 @@ public class FolderAnimationManager {
mFolderInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.folder_interpolator);
mLargeFolderPreviewItemInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.large_folder_preview_item_interpolator);
mLargeFolderPreviewItemOpenInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.large_folder_preview_item_open_interpolator);
mLargeFolderPreviewItemCloseInterpolator = AnimationUtils.loadInterpolator(mContext,
R.interpolator.large_folder_preview_item_close_interpolator);
}
@ -122,7 +125,7 @@ public class FolderAnimationManager {
final Rect folderIconPos = new Rect();
float scaleRelativeToDragLayer = mLauncher.getDragLayer()
.getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos);
float initialSize = (mFolderIcon.mBackground.getRadius() * 2) * scaleRelativeToDragLayer;
float initialSize = (mPreviewBackground.getRadius() * 2) * scaleRelativeToDragLayer;
// Match size/scale of icons in the preview
float previewScale = rule.scaleForItem(0, itemsInPreview.size());
@ -150,12 +153,11 @@ public class FolderAnimationManager {
* initialScale);
// Background can have a scaled radius in drag and drop mode.
int radiusDiff = mFolderIcon.mBackground.getScaledRadius()
- mFolderIcon.mBackground.getRadius();
int radiusDiff = mPreviewBackground.getScaledRadius()- mPreviewBackground.getRadius();
int initialX = folderIconPos.left + mFolderIcon.mBackground.getOffsetX() - paddingOffsetX
int initialX = folderIconPos.left + mPreviewBackground.getOffsetX() - paddingOffsetX
- previewItemOffsetX + radiusDiff;
int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY
int initialY = folderIconPos.top + mPreviewBackground.getOffsetY() - paddingOffsetY
+ radiusDiff;
final float xDistance = initialX - lp.x;
final float yDistance = initialY - lp.y;
@ -181,7 +183,7 @@ public class FolderAnimationManager {
AnimatorSet a = LauncherAnimUtils.createAnimatorSet();
// Initialize the Folder items' text.
PropertyResetListener colorResetListener = new PropertyResetListener(
PropertyResetListener colorResetListener = new PropertyResetListener<>(
BubbleTextView.TEXT_ALPHA_PROPERTY,
Color.alpha(Themes.getAttrColor(mContext, android.R.attr.textColorSecondary)));
for (BubbleTextView icon : mFolder.getItemsOnCurrentPage()) {
@ -210,7 +212,7 @@ public class FolderAnimationManager {
// Animate the elevation midway so that the shadow is not noticeable in the background.
int midDuration = mDuration / 2;
Animator z = getAnimator(mFolder, View.TRANSLATION_Z, -mFolder.getElevation(), 0);
play(a, z, midDuration, midDuration);
play(a, z, mIsOpening ? midDuration : 0, midDuration);
a.addListener(new AnimatorListenerAdapter() {
@Override
@ -293,14 +295,15 @@ public class FolderAnimationManager {
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.
int delay = mIsOpening ? mDelay : mDelay * 2;
if (mIsOpening) {
translationX.setStartDelay(mDelay);
translationY.setStartDelay(mDelay);
scaleAnimator.setStartDelay(mDelay);
translationX.setStartDelay(delay);
translationY.setStartDelay(delay);
scaleAnimator.setStartDelay(delay);
}
translationX.setDuration(translationX.getDuration() - mDelay);
translationY.setDuration(translationY.getDuration() - mDelay);
scaleAnimator.setDuration(scaleAnimator.getDuration() - mDelay);
translationX.setDuration(translationX.getDuration() - delay);
translationY.setDuration(translationY.getDuration() - delay);
scaleAnimator.setDuration(scaleAnimator.getDuration() - delay);
}
animatorSet.addListener(new AnimatorListenerAdapter() {
@ -343,7 +346,9 @@ public class FolderAnimationManager {
// With larger folders, we want the preview items to reach their final positions faster
// (when opening) and later (when closing) so that they appear aligned with the rest of
// the folder items when they are both visible.
return mLargeFolderPreviewItemInterpolator;
return mIsOpening
? mLargeFolderPreviewItemOpenInterpolator
: mLargeFolderPreviewItemCloseInterpolator;
}
return mFolderInterpolator;
}