From b06d95fc79389ce49dc97ecaae23e05d931a6ac2 Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 2 Apr 2012 06:26:53 -0700 Subject: [PATCH] Fix bug where overscroll never fully snapped back Bug: 6085652 Bug: 6065523 Change-Id: Iaac5705e00e08882beba0cad7ee0d339de31444a --- src/com/android/launcher2/PagedView.java | 8 +++++-- src/com/android/launcher2/Workspace.java | 28 +++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index 8a2a5a0ac6..604e73c1d6 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -396,7 +396,9 @@ public abstract class PagedView extends ViewGroup { protected boolean computeScrollHelper() { if (mScroller.computeScrollOffset()) { // Don't bother scrolling if the page does not need to be moved - if (mScrollX != mScroller.getCurrX() || mScrollY != mScroller.getCurrY()) { + if (mScrollX != mScroller.getCurrX() + || mScrollY != mScroller.getCurrY() + || mOverScrollX != mScroller.getCurrX()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); } invalidate(); @@ -755,9 +757,11 @@ public abstract class PagedView extends ViewGroup { int screenCenter = mOverScrollX + halfScreenSize; if (screenCenter != mLastScreenCenter || mForceScreenScrolled) { + // set mForceScreenScrolled before calling screenScrolled so that screenScrolled can + // set it for the next frame + mForceScreenScrolled = false; screenScrolled(screenCenter); mLastScreenCenter = screenCenter; - mForceScreenScrolled = false; } // Find out which screens are visible; as an optimization we only call draw on them diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index ba8b56f209..fd3cc1f8e9 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -171,6 +171,7 @@ public class Workspace extends SmoothPagedView private final Rect mTempRect = new Rect(); private final int[] mTempXY = new int[2]; private float mOverscrollFade = 0; + private boolean mOverscrollTransformsSet; public static final int DRAG_BITMAP_PADDING = 0; // Camera and Matrix used to determine the final position of a neighboring CellLayout @@ -1196,9 +1197,12 @@ public class Workspace extends SmoothPagedView overScrollBackgroundAlphaInterpolator(Math.abs(scrollProgress))); mOverScrollPageIndex = i; cl.setOverScrollAmount(Math.abs(scrollProgress), i == 0); - cl.setPivotX(cl.getMeasuredWidth() * (i == 0 ? 0.75f : 0.25f)); - cl.setPivotY(cl.getMeasuredHeight() * 0.5f); - cl.setOverscrollTransformsDirty(true); + if (!mOverscrollTransformsSet) { + mOverscrollTransformsSet = true; + cl.setPivotX(cl.getMeasuredWidth() * (i == 0 ? 0.75f : 0.25f)); + cl.setPivotY(cl.getMeasuredHeight() * 0.5f); + cl.setOverscrollTransformsDirty(true); + } } else if (mOverScrollPageIndex != i) { cl.setBackgroundAlphaMultiplier( backgroundAlphaInterpolator(Math.abs(scrollProgress))); @@ -1212,7 +1216,8 @@ public class Workspace extends SmoothPagedView } } } - if (!isSwitchingState() && !isInOverscroll) { + if (mOverscrollTransformsSet && !isInOverscroll) { + mOverscrollTransformsSet = false; ((CellLayout) getChildAt(0)).resetOverscrollTransforms(); ((CellLayout) getChildAt(getChildCount() - 1)).resetOverscrollTransforms(); } @@ -1226,18 +1231,21 @@ public class Workspace extends SmoothPagedView float scrollProgress = getScrollProgress(screenCenter, cl, index); cl.setOverScrollAmount(Math.abs(scrollProgress), index == 0); float rotation = - WORKSPACE_OVERSCROLL_ROTATION * scrollProgress; - cl.setCameraDistance(mDensity * CAMERA_DISTANCE); - cl.setPivotX(cl.getMeasuredWidth() * (index == 0 ? 0.75f : 0.25f)); - cl.setPivotY(cl.getMeasuredHeight() * 0.5f); cl.setRotationY(rotation); - cl.setOverscrollTransformsDirty(true); setFadeForOverScroll(Math.abs(scrollProgress)); + if (!mOverscrollTransformsSet) { + mOverscrollTransformsSet = true; + cl.setCameraDistance(mDensity * CAMERA_DISTANCE); + cl.setPivotX(cl.getMeasuredWidth() * (index == 0 ? 0.75f : 0.25f)); + cl.setPivotY(cl.getMeasuredHeight() * 0.5f); + cl.setOverscrollTransformsDirty(true); + } } else { if (mOverscrollFade != 0) { setFadeForOverScroll(0); } - // We don't want to mess with the translations during transitions - if (!isSwitchingState()) { + if (mOverscrollTransformsSet) { + mOverscrollTransformsSet = false; ((CellLayout) getChildAt(0)).resetOverscrollTransforms(); ((CellLayout) getChildAt(getChildCount() - 1)).resetOverscrollTransforms(); }