summaryrefslogtreecommitdiff
path: root/core/java/android/widget/ScrollView.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2014-09-22 09:47:48 -0700
committerAdam Powell <adamp@google.com>2014-09-22 17:18:42 -0700
commit744beffb6ae76d682c559970bb634722c835a32e (patch)
treef3175f0fb577bc5456e8978645d4f112f18f3dd2 /core/java/android/widget/ScrollView.java
parentc90b5ebbbff46e11a7c634665e9dc48ef39e2cb2 (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.java13
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) {