diff options
| author | 2016-12-07 22:26:13 +0000 | |
|---|---|---|
| committer | 2016-12-07 22:26:18 +0000 | |
| commit | 5ea27f6cf9937ee0fcc74739f6e3b51eb7d25959 (patch) | |
| tree | d3007f59b71c9f460c31c29d8c510cfaa51433e5 | |
| parent | e5e0a85ef3eb6133478990ef78be972cc787c464 (diff) | |
| parent | b3665f1737630151815b6602879e6bf236d3086f (diff) | |
Merge "Make "Drag failed" animation comply with Material Design"
| -rw-r--r-- | services/core/java/com/android/server/wm/DragState.java | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index 40b737df6680..0e4add8afc46 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -68,7 +68,8 @@ import java.util.ArrayList; * Drag/drop state */ class DragState { - private static final long ANIMATION_DURATION_MS = 500; + private static final long MIN_ANIMATION_DURATION_MS = 195; + private static final long MAX_ANIMATION_DURATION_MS = 375; private static final int DRAG_FLAGS_URI_ACCESS = View.DRAG_FLAG_GLOBAL_URI_READ | View.DRAG_FLAG_GLOBAL_URI_WRITE; @@ -103,6 +104,7 @@ class DragState { private Animation mAnimation; final Transformation mTransformation = new Transformation(); private final Interpolator mCubicEaseOutInterpolator = new DecelerateInterpolator(1.5f); + private Point mDisplaySize = new Point(); DragState(WindowManagerService service, IBinder token, SurfaceControl surface, int flags, IBinder localWin) { @@ -171,10 +173,8 @@ class DragState { // The drag window covers the entire display mDragWindowHandle.frameLeft = 0; mDragWindowHandle.frameTop = 0; - Point p = new Point(); - display.getRealSize(p); - mDragWindowHandle.frameRight = p.x; - mDragWindowHandle.frameBottom = p.y; + mDragWindowHandle.frameRight = mDisplaySize.x; + mDragWindowHandle.frameBottom = mDisplaySize.y; // Pause rotations before a drag. if (DEBUG_ORIENTATION) { @@ -215,6 +215,7 @@ class DragState { * @param display The Display that the window being dragged is on. */ void register(Display display) { + display.getRealSize(mDisplaySize); if (DEBUG_DRAG) Slog.d(TAG_WM, "registering drag input channel"); if (mInputInterceptor != null) { Slog.e(TAG_WM, "Duplicate register of drag input channel"); @@ -583,10 +584,17 @@ class DragState { private Animation createReturnAnimationLocked() { final AnimationSet set = new AnimationSet(false); - set.addAnimation(new TranslateAnimation( - 0, mOriginalX - mCurrentX, 0, mOriginalY - mCurrentY)); + final float translateX = mOriginalX - mCurrentX; + final float translateY = mOriginalY - mCurrentY; + set.addAnimation(new TranslateAnimation( 0, translateX, 0, translateY)); set.addAnimation(new AlphaAnimation(mOriginalAlpha, mOriginalAlpha / 2)); - set.setDuration(ANIMATION_DURATION_MS); + // Adjust the duration to the travel distance. + final double travelDistance = Math.sqrt(translateX * translateX + translateY * translateY); + final double displayDiagonal = + Math.sqrt(mDisplaySize.x * mDisplaySize.x + mDisplaySize.y * mDisplaySize.y); + final long duration = MIN_ANIMATION_DURATION_MS + (long) (travelDistance / displayDiagonal + * (MAX_ANIMATION_DURATION_MS - MIN_ANIMATION_DURATION_MS)); + set.setDuration(duration); set.setInterpolator(mCubicEaseOutInterpolator); set.initialize(0, 0, 0, 0); set.start(); // Will start on the first call to getTransformation. @@ -597,7 +605,7 @@ class DragState { final AnimationSet set = new AnimationSet(false); set.addAnimation(new ScaleAnimation(1, 0, 1, 0, mThumbOffsetX, mThumbOffsetY)); set.addAnimation(new AlphaAnimation(mOriginalAlpha, 0)); - set.setDuration(ANIMATION_DURATION_MS); + set.setDuration(MIN_ANIMATION_DURATION_MS); set.setInterpolator(mCubicEaseOutInterpolator); set.initialize(0, 0, 0, 0); set.start(); // Will start on the first call to getTransformation. |