mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 03:08:19 +00:00
- Increase the overlap between the preview items and the background
so that it appears more intentional (lots of reports of users
thinking that its a bug)
- Fix bug where clip path was still clipping icons when
dragging and swiping to home.
Bug: 193701705
Bug: 191225536
Test: test 2 icon, 3 icon, and 4 icon folders
close folder on 2nd page, ensure clipping
ensure no preview items are clipped in drag view
ensure no preview items are clipped in swipe up to home
test 2x2, 3x3, 4x4, 4x5, and 5x5 grids to ensure no clipping
of folder icons
drag and drop folder in and out of hotseat
create folders (2 icon, 3 icon, 4 icon)
Merged-In: Id49bae33438e10248bef05450d7e2c92c2140748
Change-Id: Ic3708bd402704f0a6f57ae5315ef602e2bbc6d82
145 lines
5.4 KiB
Java
145 lines
5.4 KiB
Java
package com.android.launcher3.folder;
|
|
|
|
public class ClippedFolderIconLayoutRule {
|
|
|
|
public static final int MAX_NUM_ITEMS_IN_PREVIEW = 4;
|
|
private static final int MIN_NUM_ITEMS_IN_PREVIEW = 2;
|
|
|
|
private static final float MIN_SCALE = 0.44f;
|
|
private static final float MAX_SCALE = 0.51f;
|
|
private static final float MAX_RADIUS_DILATION = 0.25f;
|
|
// The max amount of overlap the preview items can go outside of the background bounds.
|
|
public static final float ICON_OVERLAP_FACTOR = 1 + (MAX_RADIUS_DILATION / 2f);
|
|
private static final float ITEM_RADIUS_SCALE_FACTOR = 1.15f;
|
|
|
|
public static final int EXIT_INDEX = -2;
|
|
public static final int ENTER_INDEX = -3;
|
|
|
|
private float[] mTmpPoint = new float[2];
|
|
|
|
private float mAvailableSpace;
|
|
private float mRadius;
|
|
private float mIconSize;
|
|
private boolean mIsRtl;
|
|
private float mBaselineIconScale;
|
|
|
|
public void init(int availableSpace, float intrinsicIconSize, boolean rtl) {
|
|
mAvailableSpace = availableSpace;
|
|
mRadius = ITEM_RADIUS_SCALE_FACTOR * availableSpace / 2f;
|
|
mIconSize = intrinsicIconSize;
|
|
mIsRtl = rtl;
|
|
mBaselineIconScale = availableSpace / (intrinsicIconSize * 1f);
|
|
}
|
|
|
|
public PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems,
|
|
PreviewItemDrawingParams params) {
|
|
float totalScale = scaleForItem(curNumItems);
|
|
float transX;
|
|
float transY;
|
|
|
|
if (index == EXIT_INDEX) {
|
|
// 0 1 * <-- Exit position (row 0, col 2)
|
|
// 2 3
|
|
getGridPosition(0, 2, mTmpPoint);
|
|
} else if (index == ENTER_INDEX) {
|
|
// 0 1
|
|
// 2 3 * <-- Enter position (row 1, col 2)
|
|
getGridPosition(1, 2, mTmpPoint);
|
|
} else if (index >= MAX_NUM_ITEMS_IN_PREVIEW) {
|
|
// Items beyond those displayed in the preview are animated to the center
|
|
mTmpPoint[0] = mTmpPoint[1] = mAvailableSpace / 2 - (mIconSize * totalScale) / 2;
|
|
} else {
|
|
getPosition(index, curNumItems, mTmpPoint);
|
|
}
|
|
|
|
transX = mTmpPoint[0];
|
|
transY = mTmpPoint[1];
|
|
|
|
if (params == null) {
|
|
params = new PreviewItemDrawingParams(transX, transY, totalScale);
|
|
} else {
|
|
params.update(transX, transY, totalScale);
|
|
}
|
|
return params;
|
|
}
|
|
|
|
/**
|
|
* Builds a grid based on the positioning of the items when there are
|
|
* {@link #MAX_NUM_ITEMS_IN_PREVIEW} in the preview.
|
|
*
|
|
* Positions in the grid: 0 1 // 0 is row 0, col 1
|
|
* 2 3 // 3 is row 1, col 1
|
|
*/
|
|
private void getGridPosition(int row, int col, float[] result) {
|
|
// We use position 0 and 3 to calculate the x and y distances between items.
|
|
getPosition(0, 4, result);
|
|
float left = result[0];
|
|
float top = result[1];
|
|
|
|
getPosition(3, 4, result);
|
|
float dx = result[0] - left;
|
|
float dy = result[1] - top;
|
|
|
|
result[0] = left + (col * dx);
|
|
result[1] = top + (row * dy);
|
|
}
|
|
|
|
private void getPosition(int index, int curNumItems, float[] result) {
|
|
// The case of two items is homomorphic to the case of one.
|
|
curNumItems = Math.max(curNumItems, 2);
|
|
|
|
// We model the preview as a circle of items starting in the appropriate piece of the
|
|
// upper left quadrant (to achieve horizontal and vertical symmetry).
|
|
double theta0 = mIsRtl ? 0 : Math.PI;
|
|
|
|
// In RTL we go counterclockwise
|
|
int direction = mIsRtl ? 1 : -1;
|
|
|
|
double thetaShift = 0;
|
|
if (curNumItems == 3) {
|
|
thetaShift = Math.PI / 2;
|
|
} else if (curNumItems == 4) {
|
|
thetaShift = Math.PI / 4;
|
|
}
|
|
theta0 += direction * thetaShift;
|
|
|
|
// We want the items to appear in reading order. For the case of 1, 2 and 3 items, this
|
|
// is natural for the circular model. With 4 items, however, we need to swap the 3rd and
|
|
// 4th indices to achieve reading order.
|
|
if (curNumItems == 4 && index == 3) {
|
|
index = 2;
|
|
} else if (curNumItems == 4 && index == 2) {
|
|
index = 3;
|
|
}
|
|
|
|
// We bump the radius up between 0 and MAX_RADIUS_DILATION % as the number of items increase
|
|
float radius = mRadius * (1 + MAX_RADIUS_DILATION * (curNumItems -
|
|
MIN_NUM_ITEMS_IN_PREVIEW) / (MAX_NUM_ITEMS_IN_PREVIEW - MIN_NUM_ITEMS_IN_PREVIEW));
|
|
double theta = theta0 + index * (2 * Math.PI / curNumItems) * direction;
|
|
|
|
float halfIconSize = (mIconSize * scaleForItem(curNumItems)) / 2;
|
|
|
|
// Map the location along the circle, and offset the coordinates to represent the center
|
|
// of the icon, and to be based from the top / left of the preview area. The y component
|
|
// is inverted to match the coordinate system.
|
|
result[0] = mAvailableSpace / 2 + (float) (radius * Math.cos(theta) / 2) - halfIconSize;
|
|
result[1] = mAvailableSpace / 2 + (float) (- radius * Math.sin(theta) / 2) - halfIconSize;
|
|
|
|
}
|
|
|
|
public float scaleForItem(int numItems) {
|
|
// Scale is determined by the number of items in the preview.
|
|
final float scale;
|
|
if (numItems <= 3) {
|
|
scale = MAX_SCALE;
|
|
} else {
|
|
scale = MIN_SCALE;
|
|
}
|
|
return scale * mBaselineIconScale;
|
|
}
|
|
|
|
public float getIconSize() {
|
|
return mIconSize;
|
|
}
|
|
}
|