summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon Miranda <jonmiranda@google.com>2019-05-14 12:57:05 -0700
committerJon Miranda <jonmiranda@google.com>2019-05-14 12:57:05 -0700
commit4b8b5fd4e4a8eef149d368cde0e4784b361bea43 (patch)
treee1723f713869287973f103e3651a452485bb6d99 /src
parent0e78900d48c8cba0edc1b9095c5007b3b1b840e8 (diff)
downloadandroid_packages_apps_Trebuchet-4b8b5fd4e4a8eef149d368cde0e4784b361bea43.tar.gz
android_packages_apps_Trebuchet-4b8b5fd4e4a8eef149d368cde0e4784b361bea43.tar.bz2
android_packages_apps_Trebuchet-4b8b5fd4e4a8eef149d368cde0e4784b361bea43.zip
Center align foreground during app open, use springs during app close.
Bug: 123900446 Change-Id: Ic4ffed28f6ba8782c3d8dfa031ebd70022c4c520
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/views/FloatingIconView.java97
1 files changed, 87 insertions, 10 deletions
diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java
index cd0ae3d72..17bee6763 100644
--- a/src/com/android/launcher3/views/FloatingIconView.java
+++ b/src/com/android/launcher3/views/FloatingIconView.java
@@ -62,6 +62,9 @@ import com.android.launcher3.shortcuts.DeepShortcutView;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
+import androidx.dynamicanimation.animation.FloatPropertyCompat;
+import androidx.dynamicanimation.animation.SpringAnimation;
+import androidx.dynamicanimation.animation.SpringForce;
/**
* A view that is created to look like another view with the purpose of creating fluid animations.
@@ -76,6 +79,39 @@ public class FloatingIconView extends View implements
private static final RectF sTmpRectF = new RectF();
private static final Object[] sTmpObjArray = new Object[1];
+ // We spring the foreground drawable relative to the icon's movement in the DragLayer.
+ // We then use these two factor values to scale the movement of the fg within this view.
+ private static final int FG_TRANS_X_FACTOR = 200;
+ private static final int FG_TRANS_Y_FACTOR = 300;
+
+ private static final FloatPropertyCompat<FloatingIconView> mFgTransYProperty
+ = new FloatPropertyCompat<FloatingIconView>("FloatingViewFgTransY") {
+ @Override
+ public float getValue(FloatingIconView view) {
+ return view.mFgTransY;
+ }
+
+ @Override
+ public void setValue(FloatingIconView view, float transY) {
+ view.mFgTransY = transY;
+ view.invalidate();
+ }
+ };
+
+ private static final FloatPropertyCompat<FloatingIconView> mFgTransXProperty
+ = new FloatPropertyCompat<FloatingIconView>("FloatingViewFgTransX") {
+ @Override
+ public float getValue(FloatingIconView view) {
+ return view.mFgTransX;
+ }
+
+ @Override
+ public void setValue(FloatingIconView view, float transX) {
+ view.mFgTransX = transX;
+ view.invalidate();
+ }
+ };
+
private Runnable mEndRunnable;
private CancellationSignal mLoadIconSignal;
@@ -100,17 +136,30 @@ public class FloatingIconView extends View implements
private final Rect mOutline = new Rect();
private final Rect mFinalDrawableBounds = new Rect();
- private final Rect mBgDrawableBounds = new Rect();
private AnimatorSet mFadeAnimatorSet;
private ListenerView mListenerView;
+ private final SpringAnimation mFgSpringY;
+ private float mFgTransY;
+ private final SpringAnimation mFgSpringX;
+ private float mFgTransX;
+
private FloatingIconView(Launcher launcher) {
super(launcher);
mLauncher = launcher;
mBlurSizeOutline = getResources().getDimensionPixelSize(
R.dimen.blur_size_medium_outline);
mListenerView = new ListenerView(launcher, null);
+
+ mFgSpringX = new SpringAnimation(this, mFgTransXProperty)
+ .setSpring(new SpringForce()
+ .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)
+ .setStiffness(SpringForce.STIFFNESS_LOW));
+ mFgSpringY = new SpringAnimation(this, mFgTransYProperty)
+ .setSpring(new SpringForce()
+ .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)
+ .setStiffness(SpringForce.STIFFNESS_LOW));
}
@Override
@@ -178,7 +227,31 @@ public class FloatingIconView extends View implements
mRevealAnimator.setCurrentFraction(shapeRevealProgress);
}
- setBackgroundDrawableBounds(mOutline.height() / minSize);
+ float drawableScale = mOutline.height() / minSize;
+ setBackgroundDrawableBounds(drawableScale);
+ if (isOpening) {
+ // Center align foreground
+ int height = mFinalDrawableBounds.height();
+ int width = mFinalDrawableBounds.width();
+ int diffY = mIsVerticalBarLayout ? 0
+ : (int) (((height * drawableScale) - height) / 2);
+ int diffX = mIsVerticalBarLayout ? (int) (((width * drawableScale) - width) / 2)
+ : 0;
+ sTmpRect.set(mFinalDrawableBounds);
+ sTmpRect.offset(diffX, diffY);
+ mForeground.setBounds(sTmpRect);
+ } else {
+ // Spring the foreground relative to the icon's movement within the DragLayer.
+ int diffX = (int) (dX / mLauncher.getDeviceProfile().availableWidthPx
+ * FG_TRANS_X_FACTOR);
+ int diffY = (int) (dY / mLauncher.getDeviceProfile().availableHeightPx
+ * FG_TRANS_Y_FACTOR);
+
+ mFgSpringX.animateToFinalPosition(diffX);
+ mFgSpringY.animateToFinalPosition(diffY);
+ }
+
+
}
invalidate();
invalidateOutline();
@@ -393,17 +466,15 @@ public class FloatingIconView extends View implements
}
private void setBackgroundDrawableBounds(float scale) {
- mBgDrawableBounds.set(mFinalDrawableBounds);
- Utilities.scaleRectAboutCenter(mBgDrawableBounds, scale);
+ sTmpRect.set(mFinalDrawableBounds);
+ Utilities.scaleRectAboutCenter(sTmpRect, scale);
// Since the drawable is at the top of the view, we need to offset to keep it centered.
if (mIsVerticalBarLayout) {
- mBgDrawableBounds.offsetTo((int) (mFinalDrawableBounds.left * scale),
- mBgDrawableBounds.top);
+ sTmpRect.offsetTo((int) (mFinalDrawableBounds.left * scale), sTmpRect.top);
} else {
- mBgDrawableBounds.offsetTo(mBgDrawableBounds.left,
- (int) (mFinalDrawableBounds.top * scale));
+ sTmpRect.offsetTo(sTmpRect.left, (int) (mFinalDrawableBounds.top * scale));
}
- mBackground.setBounds(mBgDrawableBounds);
+ mBackground.setBounds(sTmpRect);
}
@WorkerThread
@@ -448,7 +519,10 @@ public class FloatingIconView extends View implements
mBackground.draw(canvas);
}
if (mForeground != null) {
+ int count2 = canvas.save();
+ canvas.translate(mFgTransX, mFgTransY);
mForeground.draw(canvas);
+ canvas.restoreToCount(count2);
}
canvas.restoreToCount(count);
}
@@ -624,7 +698,6 @@ public class FloatingIconView extends View implements
mBackground = null;
mClipPath = null;
mFinalDrawableBounds.setEmpty();
- mBgDrawableBounds.setEmpty();
if (mRevealAnimator != null) {
mRevealAnimator.cancel();
}
@@ -639,5 +712,9 @@ public class FloatingIconView extends View implements
mOnTargetChangeRunnable = null;
mTaskCornerRadius = 0;
mOutline.setEmpty();
+ mFgTransY = 0;
+ mFgSpringX.cancel();
+ mFgTransX = 0;
+ mFgSpringY.cancel();
}
}