mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 19:38:21 +00:00
Merge "Improving adding widgets animations"
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user