diff options
author | Adam Cohen <adamcohen@google.com> | 2011-07-15 17:55:02 -0700 |
---|---|---|
committer | Adam Cohen <adamcohen@google.com> | 2011-07-17 12:55:24 -0700 |
commit | b7e1618c627c6471c565f4f599228648d9e70a10 (patch) | |
tree | 0d984de4bd09bd75bbcf148333b95700510f3464 | |
parent | d8d375d99a844bd521e79b47195785e4f28c34cf (diff) | |
download | packages_apps_trebuchet-b7e1618c627c6471c565f4f599228648d9e70a10.zip packages_apps_trebuchet-b7e1618c627c6471c565f4f599228648d9e70a10.tar.gz packages_apps_trebuchet-b7e1618c627c6471c565f4f599228648d9e70a10.tar.bz2 |
Improving adding widgets animations
Change-Id: I9730d3d531736bde58cdf1bf2da049392d4da83a
-rw-r--r-- | src/com/android/launcher2/DragLayer.java | 43 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 67 |
2 files changed, 78 insertions, 32 deletions
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java index 37abe5a..9997c29 100644 --- a/src/com/android/launcher2/DragLayer.java +++ b/src/com/android/launcher2/DragLayer.java @@ -178,7 +178,7 @@ public class DragLayer extends FrameLayout { return scale; } - private float getDescendantCoordRelativeToSelf(View descendant, int[] coord) { + public float getDescendantCoordRelativeToSelf(View descendant, int[] coord) { float scale = 1.0f; float[] pt = {coord[0], coord[1]}; descendant.getMatrix().mapPoints(pt); @@ -319,6 +319,17 @@ public class DragLayer extends FrameLayout { animateViewIntoPosition(dragView, child, null); } + public void animateViewIntoPosition(DragView dragView, final int[] pos, float scale, + Runnable onFinishRunnable) { + Rect r = new Rect(); + getViewRectRelativeToSelf(dragView, r); + final int fromX = r.left; + final int fromY = r.top; + + animateViewIntoPosition(dragView, fromX, fromY, pos[0], pos[1], scale, + onFinishRunnable, true); + } + public void animateViewIntoPosition(DragView dragView, final View child, final Runnable onFinishAnimationRunnable) { ((CellLayoutChildren) child.getParent()).measureChild(child); @@ -373,18 +384,6 @@ public class DragLayer extends FrameLayout { animateViewIntoPosition(dragView, fromX, fromY, toX, toY, scale, onCompleteRunnable, true); } - /* Just fade out in place */ - public void animateViewOut(DragView dragView, Runnable onFinishAnimationRunnable) { - Rect r = new Rect(); - getViewRectRelativeToSelf(dragView, r); - final int fromX = r.left; - final int fromY = r.top; - final int toX = fromX; - final int toY = fromY; - animateViewIntoPosition(dragView, fromX, fromY, toX, toY, 1.0f, onFinishAnimationRunnable, - true); - } - private void animateViewIntoPosition(final View view, final int fromX, final int fromY, final int toX, final int toY, float finalScale, Runnable onCompleteRunnable, boolean fadeOut) { @@ -394,6 +393,24 @@ public class DragLayer extends FrameLayout { animateView(view, from, to, 1f, finalScale, -1, null, null, onCompleteRunnable, true); } + /** + * This method animates a view at the end of a drag and drop animation. + * + * @param view The view to be animated. This view is drawn directly into DragLayer, and so + * doesn't need to be a child of DragLayer. + * @param from The initial location of the view. Only the left and top parameters are used. + * @param to The final location of the view. Only the left and top parameters are used. This + * location doesn't account for scaling, and so should be centered about the desired + * final location (including scaling). + * @param finalAlpha The final alpha of the view, in case we want it to fade as it animates. + * @param finalScale The final scale of the view. The view is scaled about its center. + * @param duration The duration of the animation. + * @param motionInterpolator The interpolator to use for the location of the view. + * @param alphaInterpolator The interpolator to use for the alpha of the view. + * @param onCompleteRunnable Optional runnable to run on animation completion. + * @param fadeOut Whether or not to fade out the view once the animation completes. If true, + * the runnable will execute after the view is faded out. + */ public void animateView(final View view, final Rect from, final Rect to, final float finalAlpha, final float finalScale, int duration, final Interpolator motionInterpolator, final Interpolator alphaInterpolator, final Runnable onCompleteRunnable, diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index f8e3f5a..d2da819 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -2834,33 +2834,72 @@ public class Workspace extends SmoothPagedView mLauncher.exitSpringLoadedDragModeDelayed(false); } }; + + ItemInfo info = (ItemInfo) dragInfo; + int spanX = info.spanX; + int spanY = info.spanY; + if (mDragInfo != null) { + spanX = mDragInfo.spanX; + spanY = mDragInfo.spanY; + } + final int screen = indexOfChild(cellLayout); if (screen != mCurrentPage && mState != State.SPRING_LOADED) { snapToPage(screen); } - if (dragInfo instanceof PendingAddItemInfo) { - final PendingAddItemInfo info = (PendingAddItemInfo) dragInfo; - mLauncher.getDragLayer().animateViewOut(d.dragView, new Runnable() { + + if (info instanceof PendingAddItemInfo) { + final PendingAddItemInfo pendingInfo = (PendingAddItemInfo) dragInfo; + + Runnable onAnimationCompleteRunnable = new Runnable() { @Override public void run() { // When dragging and dropping from customization tray, we deal with creating // widgets/shortcuts/folders in a slightly different way - switch (info.itemType) { + switch (pendingInfo.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: - mLauncher.addAppWidgetFromDrop((PendingAddWidgetInfo) info, screen, touchXY); + mLauncher.addAppWidgetFromDrop((PendingAddWidgetInfo) pendingInfo, + screen, touchXY); break; case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - mLauncher.processShortcutFromDrop(info.componentName, screen, touchXY); + mLauncher.processShortcutFromDrop(pendingInfo.componentName, + screen, touchXY); break; default: - throw new IllegalStateException("Unknown item type: " + info.itemType); + throw new IllegalStateException("Unknown item type: " + + pendingInfo.itemType); } cellLayout.onDragExit(); } - }); + }; + + // Now we animate the dragView, (ie. the widget or shortcut preview) into its final + // location and size on the home screen. + + // The target cell is also calculated later in Launcher when the widget is actually + // added, however, we do it here as well to find out where to animate to. The re-use + // of this computation required to much restructuring. + mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], spanX, spanY, null, + cellLayout, mTargetCell); + + int loc[] = new int[2]; + cellLayout.cellToPoint(mTargetCell[0], mTargetCell[1], loc); + + RectF r = new RectF(); + cellLayout.cellToRect(mTargetCell[0], mTargetCell[1], spanX, spanY, r); + float cellLayoutScale = + mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(cellLayout, loc); + + float dragViewScale = r.width() / d.dragView.getMeasuredWidth(); + // The animation will scale the dragView about its center, so we need to center about + // the final location. + loc[0] -= (d.dragView.getMeasuredWidth() - cellLayoutScale * r.width()) / 2; + loc[1] -= (d.dragView.getMeasuredHeight() - cellLayoutScale * r.height()) / 2; + + mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, loc, + dragViewScale * cellLayoutScale, onAnimationCompleteRunnable); } else { // This is for other drag/drop cases, like dragging from All Apps - ItemInfo info = (ItemInfo) dragInfo; View view = null; switch (info.itemType) { @@ -2881,16 +2920,6 @@ public class Workspace extends SmoothPagedView throw new IllegalStateException("Unknown item type: " + info.itemType); } - int spanX = 1; - int spanY = 1; - if (mDragInfo != null) { - spanX = mDragInfo.spanX; - spanY = mDragInfo.spanY; - } else { - spanX = info.spanX; - spanY = info.spanY; - } - // First we find the cell nearest to point at which the item is // dropped, without any consideration to whether there is an item there. if (touchXY != null) { |