Merge "Fix folder animations in spring loaded mode + polish." into ub-launcher3-master
diff --git a/res/interpolator/folder_closing_interpolator.xml b/res/interpolator/folder_closing_interpolator.xml
deleted file mode 100644
index e6e012e..0000000
--- a/res/interpolator/folder_closing_interpolator.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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.8"
- android:controlY1="0"
- android:controlX2="0.8"
- android:controlY2="1"/>
diff --git a/res/interpolator/folder_opening_interpolator.xml b/res/interpolator/folder_interpolator.xml
similarity index 100%
rename from res/interpolator/folder_opening_interpolator.xml
rename to res/interpolator/folder_interpolator.xml
diff --git a/res/interpolator/folder_preview_item_closing_interpolator.xml b/res/interpolator/folder_preview_item_closing_interpolator.xml
deleted file mode 100644
index d8ddb0c..0000000
--- a/res/interpolator/folder_preview_item_closing_interpolator.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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.5"
- android:controlY1="0"
- android:controlX2="1"
- android:controlY2="0"/>
diff --git a/res/interpolator/folder_preview_item_opening_interpolator.xml b/res/interpolator/large_folder_preview_item_interpolator.xml
similarity index 100%
rename from res/interpolator/folder_preview_item_opening_interpolator.xml
rename to res/interpolator/large_folder_preview_item_interpolator.xml
diff --git a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java
index 9c09477..a0d1f8b 100644
--- a/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java
+++ b/src/com/android/launcher3/anim/RoundedRectRevealOutlineProvider.java
@@ -42,7 +42,7 @@
@Override
public boolean shouldRemoveElevationDuringAnimation() {
- return false;
+ return true;
}
@Override
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index a62d1b7..578921f 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -67,10 +67,8 @@
private final int mDuration;
private final int mDelay;
- private final TimeInterpolator mOpeningInterpolator;
- private final TimeInterpolator mClosingInterpolator;
- private final TimeInterpolator mPreviewItemOpeningInterpolator;
- private final TimeInterpolator mPreviewItemClosingInterpolator;
+ private final TimeInterpolator mFolderInterpolator;
+ private final TimeInterpolator mLargeFolderPreviewItemInterpolator;
private final FolderIcon.PreviewItemDrawingParams mTmpParams =
new FolderIcon.PreviewItemDrawingParams(0, 0, 0, 0);
@@ -122,14 +120,10 @@
mDuration = mFolder.mMaterialExpandDuration;
mDelay = mContext.getResources().getInteger(R.integer.config_folderDelay);
- mOpeningInterpolator = AnimationUtils.loadInterpolator(mContext,
- R.interpolator.folder_opening_interpolator);
- mClosingInterpolator = AnimationUtils.loadInterpolator(mContext,
- R.interpolator.folder_closing_interpolator);
- mPreviewItemOpeningInterpolator = AnimationUtils.loadInterpolator(mContext,
- R.interpolator.folder_preview_item_opening_interpolator);
- mPreviewItemClosingInterpolator = AnimationUtils.loadInterpolator(mContext,
- R.interpolator.folder_preview_item_closing_interpolator);
+ mFolderInterpolator = AnimationUtils.loadInterpolator(mContext,
+ R.interpolator.folder_interpolator);
+ mLargeFolderPreviewItemInterpolator = AnimationUtils.loadInterpolator(mContext,
+ R.interpolator.large_folder_preview_item_interpolator);
}
@@ -141,12 +135,16 @@
FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule();
final List<BubbleTextView> itemsInPreview = mFolderIcon.getItemsToDisplay();
+ // Match position of the FolderIcon
+ final Rect folderIconPos = new Rect();
+ float scaleRelativeToDragLayer = mLauncher.getDragLayer()
+ .getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos);
+
// Match size/scale of icons in the preview
float previewScale = rule.scaleForItem(0, itemsInPreview.size());
float previewSize = rule.getIconSize() * previewScale;
- float folderScale = previewSize / itemsInPreview.get(0).getIconSize();
-
- final float initialScale = folderScale;
+ float initialScale = previewSize / itemsInPreview.get(0).getIconSize()
+ * scaleRelativeToDragLayer;
final float finalScale = 1f;
float scale = mIsOpening ? initialScale : finalScale;
mFolder.setScaleX(scale);
@@ -154,25 +152,24 @@
mFolder.setPivotX(0);
mFolder.setPivotY(0);
- // Match position of the FolderIcon
- final Rect folderIconPos = new Rect();
- float scaleRelativeToDragLayer = mLauncher.getDragLayer()
- .getDescendantRectRelativeToSelf(mFolderIcon, folderIconPos);
- folderScale *= scaleRelativeToDragLayer;
-
// We want to create a small X offset for the preview items, so that they follow their
// expected path to their final locations. ie. an icon should not move right, if it's final
// location is to its left. This value is arbitrarily defined.
- final int nudgeOffsetX = (int) (previewSize / 2);
+ int previewItemOffsetX = (int) (previewSize / 2);
final int paddingOffsetX = (int) ((mFolder.getPaddingLeft() + mContent.getPaddingLeft())
- * folderScale);
+ * initialScale);
final int paddingOffsetY = (int) ((mFolder.getPaddingTop() + mContent.getPaddingTop())
- * folderScale);
+ * initialScale);
+
+ // Background can have a scaled radius in drag and drop mode.
+ int radiusDiff = mFolderIcon.mBackground.getScaledRadius()
+ - mFolderIcon.mBackground.getRadius();
int initialX = folderIconPos.left + mFolderIcon.mBackground.getOffsetX() - paddingOffsetX
- - nudgeOffsetX;
- int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY;
+ - previewItemOffsetX + radiusDiff;
+ int initialY = folderIconPos.top + mFolderIcon.mBackground.getOffsetY() - paddingOffsetY
+ + radiusDiff;
final float xDistance = initialX - lp.x;
final float yDistance = initialY - lp.y;
@@ -189,13 +186,17 @@
: finalTextColor);
// Set up the reveal animation that clips the Folder.
- float stroke = mPreviewBackground.getStrokeWidth();
- int initialSize = (int) ((mFolderIcon.mBackground.getRadius() * 2 + stroke) / folderScale);
- int totalOffsetX = paddingOffsetX + Math.round(nudgeOffsetX / folderScale);
- int unscaledStroke = (int) Math.floor(stroke / folderScale);
- Rect startRect = new Rect(totalOffsetX + unscaledStroke, unscaledStroke,
- totalOffsetX + initialSize, initialSize);
+ float initialSize = (mFolderIcon.mBackground.getRadius() * 2
+ + mPreviewBackground.getStrokeWidth()) * scaleRelativeToDragLayer;
+
+ int totalOffsetX = paddingOffsetX + previewItemOffsetX;
+ Rect startRect = new Rect(
+ Math.round(totalOffsetX / initialScale),
+ Math.round(paddingOffsetY / initialScale),
+ Math.round((totalOffsetX + initialSize) / initialScale),
+ Math.round((paddingOffsetY + initialSize) / initialScale));
Rect endRect = new Rect(0, 0, lp.width, lp.height);
+ float initialRadius = initialSize / initialScale / 2f;
float finalRadius = Utilities.pxFromDp(2, mContext.getResources().getDisplayMetrics());
// Create the animators.
@@ -206,7 +207,7 @@
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,
+ play(a, new RoundedRectRevealOutlineProvider(initialRadius, finalRadius, startRect,
endRect).createRevealAnimator(mFolder, !mIsOpening));
a.addListener(new AnimatorListenerAdapter() {
@@ -224,18 +225,18 @@
// We set the interpolator on all current child animators here, because the preview item
// animators may use a different interpolator.
for (Animator animator : a.getChildAnimations()) {
- animator.setInterpolator(mIsOpening ? mOpeningInterpolator : mClosingInterpolator);
+ animator.setInterpolator(mFolderInterpolator);
}
- addPreviewItemAnimatorsToSet(a, folderScale, nudgeOffsetX);
+ addPreviewItemAnimators(a, initialScale / scaleRelativeToDragLayer, previewItemOffsetX);
return a;
}
/**
* Animate the items that are displayed in the preview.
*/
- private void addPreviewItemAnimatorsToSet(AnimatorSet animatorSet, final float folderScale,
- int nudgeOffsetX) {
+ private void addPreviewItemAnimators(AnimatorSet animatorSet, final float folderScale,
+ int previewItemOffsetX) {
FolderIcon.PreviewLayoutRule rule = mFolderIcon.getLayoutRule();
final List<BubbleTextView> itemsInPreview = mFolderIcon.getItemsToDisplay();
final int numItemsInPreview = itemsInPreview.size();
@@ -269,7 +270,7 @@
int iconOffsetX = (int) ((btvLp.width - btv.getIconSize()) * iconScale) / 2;
final int previewPosX =
- (int) ((mTmpParams.transX - iconOffsetX + nudgeOffsetX) / folderScale);
+ (int) ((mTmpParams.transX - iconOffsetX + previewItemOffsetX) / folderScale);
final int previewPosY = (int) (mTmpParams.transY / folderScale);
final float xDistance = previewPosX - btvLp.x;
@@ -335,9 +336,9 @@
// 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 mIsOpening ? mPreviewItemOpeningInterpolator : mPreviewItemClosingInterpolator;
+ return mLargeFolderPreviewItemInterpolator;
}
- return mIsOpening ? mOpeningInterpolator : mClosingInterpolator;
+ return mFolderInterpolator;
}
private Animator getAnimator(View view, Property property, float v1, float v2) {