summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/CellLayout.java
diff options
context:
space:
mode:
authorJon Miranda <jonmiranda@google.com>2016-12-19 14:12:05 -0800
committerJon Miranda <jonmiranda@google.com>2016-12-20 09:31:47 -0800
commit2126691ce23b4c62e6d17cb9643faf4c2b3886da (patch)
tree887dea42ae123f2d1ef992f1b4fb2f1ff3053461 /src/com/android/launcher3/CellLayout.java
parent90a40570bc54506979d3610ee331deacfa7300ec (diff)
downloadandroid_packages_apps_Trebuchet-2126691ce23b4c62e6d17cb9643faf4c2b3886da.tar.gz
android_packages_apps_Trebuchet-2126691ce23b4c62e6d17cb9643faf4c2b3886da.tar.bz2
android_packages_apps_Trebuchet-2126691ce23b4c62e6d17cb9643faf4c2b3886da.zip
Fix widget reorder animations in multi-window mode.
The original animation assumed that the views are not translated and not scaled. In multi-window mode this assumption is no longer valid, because app widgets are scaled and translated to fit center within their cells. Bug: 32176631 Change-Id: Id60c793730d982277c9d91860e9fb0e6a0df7d38
Diffstat (limited to 'src/com/android/launcher3/CellLayout.java')
-rw-r--r--src/com/android/launcher3/CellLayout.java62
1 files changed, 41 insertions, 21 deletions
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 1e212bfd8..c100ddc4d 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -1975,6 +1975,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
private static final int PREVIEW_DURATION = 300;
private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT;
+ private static final float CHILD_DIVIDEND = 4.0f;
+
public static final int MODE_HINT = 0;
public static final int MODE_PREVIEW = 1;
@@ -1990,42 +1992,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
final int y1 = mTmpPoint[1];
final int dX = x1 - x0;
final int dY = y1 - y0;
- finalDeltaX = 0;
- finalDeltaY = 0;
+
+ this.child = child;
+ this.mode = mode;
+ setInitialAnimationValues(false);
+ finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale;
+ finalDeltaX = initDeltaX;
+ finalDeltaY = initDeltaY;
int dir = mode == MODE_HINT ? -1 : 1;
if (dX == dY && dX == 0) {
} else {
if (dY == 0) {
- finalDeltaX = - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
+ finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
} else if (dX == 0) {
- finalDeltaY = - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
+ finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
} else {
double angle = Math.atan( (float) (dY) / dX);
- finalDeltaX = (int) (- dir * Math.signum(dX) *
+ finalDeltaX += (int) (- dir * Math.signum(dX) *
Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude));
- finalDeltaY = (int) (- dir * Math.signum(dY) *
+ finalDeltaY += (int) (- dir * Math.signum(dY) *
Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude));
}
}
- this.mode = mode;
- initDeltaX = child.getTranslationX();
- initDeltaY = child.getTranslationY();
- finalScale = mChildScale - 4.0f / child.getWidth();
- initScale = child.getScaleX();
- this.child = child;
+ }
+
+ void setInitialAnimationValues(boolean restoreOriginalValues) {
+ if (restoreOriginalValues) {
+ if (child instanceof LauncherAppWidgetHostView) {
+ LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child;
+ initScale = lahv.getScaleToFit();
+ initDeltaX = lahv.getTranslationForCentering().x;
+ initDeltaY = lahv.getTranslationForCentering().y;
+ } else {
+ initScale = mChildScale;
+ initDeltaX = 0;
+ initDeltaY = 0;
+ }
+ } else {
+ initScale = child.getScaleX();
+ initDeltaX = child.getTranslationX();
+ initDeltaY = child.getTranslationY();
+ }
}
void animate() {
+ boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY);
+
if (mShakeAnimators.containsKey(child)) {
ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child);
oldAnimation.cancel();
mShakeAnimators.remove(child);
- if (finalDeltaX == 0 && finalDeltaY == 0) {
+ if (noMovement) {
completeAnimationImmediately();
return;
}
}
- if (finalDeltaX == 0 && finalDeltaY == 0) {
+ if (noMovement) {
return;
}
ValueAnimator va = LauncherAnimUtils.ofFloat(child, 0f, 1f);
@@ -2058,9 +2080,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
va.addListener(new AnimatorListenerAdapter() {
public void onAnimationRepeat(Animator animation) {
// We make sure to end only after a full period
- initDeltaX = 0;
- initDeltaY = 0;
- initScale = mChildScale;
+ setInitialAnimationValues(true);
repeating = true;
}
});
@@ -2080,10 +2100,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
}
a = new LauncherViewPropertyAnimator(child)
- .scaleX(mChildScale)
- .scaleY(mChildScale)
- .translationX(0)
- .translationY(0)
+ .scaleX(initScale)
+ .scaleY(initScale)
+ .translationX(initDeltaX)
+ .translationY(initDeltaY)
.setDuration(REORDER_ANIMATION_DURATION);
a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f));
a.start();