mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-01 00:06:47 +00:00
Merge "Scale, crop, and translate window when swiping back to home." into sc-v2-dev am: 80aa8da7e3
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/16470663 Change-Id: I229d888f03692b575584c66b60eb6e16bcffb85e
This commit is contained in:
@@ -660,10 +660,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(), mDeviceProfile,
|
||||
windowTargetBounds, launcherIconBounds, v, dragLayerBounds[0], dragLayerBounds[1],
|
||||
hasSplashScreen, floatingView.isDifferentFromAppIcon());
|
||||
int left = (int) (prop.cropCenterXStart - prop.cropWidthStart / 2);
|
||||
int top = (int) (prop.cropCenterYStart - prop.cropHeightStart / 2);
|
||||
int right = (int) (left + prop.cropWidthStart);
|
||||
int bottom = (int) (top + prop.cropHeightStart);
|
||||
int left = prop.cropCenterXStart - prop.cropWidthStart / 2;
|
||||
int top = prop.cropCenterYStart - prop.cropHeightStart / 2;
|
||||
int right = left + prop.cropWidthStart;
|
||||
int bottom = top + prop.cropHeightStart;
|
||||
// Set the crop here so we can calculate the corner radius below.
|
||||
crop.set(left, top, right, bottom);
|
||||
|
||||
@@ -1329,6 +1329,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
mDeviceProfile);
|
||||
|
||||
// Hook up floating views to the closing window animators.
|
||||
final int rotationChange = getRotationChange(targets);
|
||||
Rect windowTargetBounds = getWindowTargetBounds(targets, rotationChange);
|
||||
if (floatingIconView != null) {
|
||||
anim.addAnimatorListener(floatingIconView);
|
||||
floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged);
|
||||
@@ -1339,7 +1341,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
// FolderIconView can be seen morphing into the icon shape.
|
||||
final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION;
|
||||
|
||||
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect) {
|
||||
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
|
||||
windowTargetBounds) {
|
||||
@Override
|
||||
public void onUpdate(RectF currentRectF, float progress) {
|
||||
finalFloatingIconView.update(1f, 255 /* fgAlpha */, currentRectF, progress,
|
||||
@@ -1356,7 +1359,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
|
||||
final float floatingWidgetAlpha = isTransluscent ? 0 : 1;
|
||||
FloatingWidgetView finalFloatingWidget = floatingWidget;
|
||||
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect) {
|
||||
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
|
||||
windowTargetBounds) {
|
||||
@Override
|
||||
public void onUpdate(RectF currentRectF, float progress) {
|
||||
final float fallbackBackgroundAlpha =
|
||||
@@ -1767,12 +1771,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
private final float mStartRadius;
|
||||
private final float mEndRadius;
|
||||
private final SurfaceTransactionApplier mSurfaceApplier;
|
||||
private final Rect mWindowTargetBounds = new Rect();
|
||||
|
||||
SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect) {
|
||||
private final Rect mTmpRect = new Rect();
|
||||
|
||||
SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect,
|
||||
Rect windowTargetBounds) {
|
||||
mAppTargets = appTargets;
|
||||
mStartRadius = QuickStepContract.getWindowCornerRadius(mLauncher);
|
||||
mEndRadius = Math.max(1, targetRect.width()) / 2f;
|
||||
mSurfaceApplier = new SurfaceTransactionApplier(mDragLayer);
|
||||
mWindowTargetBounds.set(windowTargetBounds);
|
||||
}
|
||||
|
||||
public float getCornerRadius(float progress) {
|
||||
@@ -1793,13 +1802,36 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
||||
}
|
||||
|
||||
if (target.mode == MODE_CLOSING) {
|
||||
float alpha = getWindowAlpha(progress);
|
||||
currentRectF.round(mCurrentRect);
|
||||
|
||||
// Scale the target window to match the currentRectF.
|
||||
final float scale;
|
||||
|
||||
// We need to infer the crop (we crop the window to match the currentRectF).
|
||||
if (mWindowTargetBounds.height() > mWindowTargetBounds.width()) {
|
||||
scale = Math.min(1f, currentRectF.width() / mWindowTargetBounds.width());
|
||||
|
||||
int unscaledHeight = (int) (mCurrentRect.height() * (1f / scale));
|
||||
int croppedHeight = mWindowTargetBounds.height() - unscaledHeight;
|
||||
mTmpRect.set(0, 0, mWindowTargetBounds.width(),
|
||||
mWindowTargetBounds.height() - croppedHeight);
|
||||
} else {
|
||||
scale = Math.min(1f, currentRectF.height() / mWindowTargetBounds.height());
|
||||
|
||||
int unscaledWidth = (int) (mCurrentRect.width() * (1f / scale));
|
||||
int croppedWidth = mWindowTargetBounds.width() - unscaledWidth;
|
||||
mTmpRect.set(0, 0, mWindowTargetBounds.width() - croppedWidth,
|
||||
mWindowTargetBounds.height());
|
||||
}
|
||||
|
||||
// Match size and position of currentRect.
|
||||
mMatrix.setScale(scale, scale);
|
||||
mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);
|
||||
|
||||
builder.withMatrix(mMatrix)
|
||||
.withWindowCrop(mCurrentRect)
|
||||
.withAlpha(alpha)
|
||||
.withCornerRadius(getCornerRadius(progress));
|
||||
.withWindowCrop(mTmpRect)
|
||||
.withAlpha(getWindowAlpha(progress))
|
||||
.withCornerRadius(getCornerRadius(progress) / scale);
|
||||
} else if (target.mode == MODE_OPENING) {
|
||||
mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
|
||||
builder.withMatrix(mMatrix)
|
||||
|
||||
Reference in New Issue
Block a user