diff options
| author | Adam Powell <adamp@google.com> | 2014-09-22 09:47:48 -0700 |
|---|---|---|
| committer | Adam Powell <adamp@google.com> | 2014-09-22 17:18:42 -0700 |
| commit | 744beffb6ae76d682c559970bb634722c835a32e (patch) | |
| tree | f3175f0fb577bc5456e8978645d4f112f18f3dd2 /core/java/android/widget/ScrollView.java | |
| parent | c90b5ebbbff46e11a7c634665e9dc48ef39e2cb2 (diff) | |
Track persistent nested Y offset for fling velocity
Track the nested offsets applied persistently in AbsListView and
ScrollView. This allows accurate velocity to be reported to nested
fling/pre-fling.
Bug 17548219
Change-Id: I66199c534aca7fb81746eff6d04c931e4c4e48da
Diffstat (limited to 'core/java/android/widget/ScrollView.java')
| -rw-r--r-- | core/java/android/widget/ScrollView.java | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index dd312a664c96..a90b39247a0a 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -142,6 +142,7 @@ public class ScrollView extends FrameLayout { */ private final int[] mScrollOffset = new int[2]; private final int[] mScrollConsumed = new int[2]; + private int mNestedYOffset; /** * The StrictMode "critical time span" objects to catch animation @@ -516,6 +517,7 @@ public class ScrollView extends FrameLayout { mLastMotionY = y; initVelocityTrackerIfNotExists(); mVelocityTracker.addMovement(ev); + mNestedYOffset = 0; if (mScrollStrictSpan == null) { mScrollStrictSpan = StrictMode.enterCriticalSpan("ScrollView-scroll"); } @@ -586,9 +588,14 @@ public class ScrollView extends FrameLayout { MotionEvent vtev = MotionEvent.obtain(ev); - final int action = ev.getAction(); + final int actionMasked = ev.getActionMasked(); - switch (action & MotionEvent.ACTION_MASK) { + if (actionMasked == MotionEvent.ACTION_DOWN) { + mNestedYOffset = 0; + } + vtev.offsetLocation(0, mNestedYOffset); + + switch (actionMasked) { case MotionEvent.ACTION_DOWN: { if (getChildCount() == 0) { return false; @@ -630,6 +637,7 @@ public class ScrollView extends FrameLayout { if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) { deltaY -= mScrollConsumed[1]; vtev.offsetLocation(0, mScrollOffset[1]); + mNestedYOffset += mScrollOffset[1]; } if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) { final ViewParent parent = getParent(); @@ -666,6 +674,7 @@ public class ScrollView extends FrameLayout { if (dispatchNestedScroll(0, scrolledDeltaY, 0, unconsumedY, mScrollOffset)) { mLastMotionY -= mScrollOffset[1]; vtev.offsetLocation(0, mScrollOffset[1]); + mNestedYOffset += mScrollOffset[1]; } else if (canOverscroll) { final int pulledToY = oldY + deltaY; if (pulledToY < 0) { |
