diff options
| author | Adam Powell <adamp@google.com> | 2012-05-02 22:05:46 -0700 |
|---|---|---|
| committer | Adam Powell <adamp@google.com> | 2012-05-02 22:14:13 -0700 |
| commit | b3e02c44d57ac18d1debf21044289cf85d0dd672 (patch) | |
| tree | 50d26abf8f8b0fd740e712543fea6b043a252918 /core/java/android/widget/ScrollView.java | |
| parent | fbbdbc2d2326e96ce31950baccddd2f295fe594c (diff) | |
Fix nested cross-scrolling for ScrollView/HorizontalScrollView
Bug 6429006
Disallow intercepting touch events for parents of
ScrollView/HorizontalScrollView when scrolling begins. Properly
respect touch slop when the child of a ScrollView does not accept
touch events.
Change-Id: I2ce503ad5104d450829ed58cd2748c9163e020d3
Diffstat (limited to 'core/java/android/widget/ScrollView.java')
| -rw-r--r-- | core/java/android/widget/ScrollView.java | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 0f0dbae03e37..f912c6625621 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -482,6 +482,10 @@ public class ScrollView extends FrameLayout { if (mScrollStrictSpan == null) { mScrollStrictSpan = StrictMode.enterCriticalSpan("ScrollView-scroll"); } + final ViewParent parent = getParent(); + if (parent != null) { + parent.requestDisallowInterceptTouchEvent(true); + } } break; } @@ -546,10 +550,15 @@ public class ScrollView extends FrameLayout { switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - mIsBeingDragged = getChildCount() != 0; - if (!mIsBeingDragged) { + if (getChildCount() == 0) { return false; } + if ((mIsBeingDragged = !mScroller.isFinished())) { + final ViewParent parent = getParent(); + if (parent != null) { + parent.requestDisallowInterceptTouchEvent(true); + } + } /* * If being flinged and user touches, stop the fling. isFinished @@ -569,11 +578,23 @@ public class ScrollView extends FrameLayout { break; } case MotionEvent.ACTION_MOVE: + final int activePointerIndex = ev.findPointerIndex(mActivePointerId); + final int y = (int) ev.getY(activePointerIndex); + int deltaY = mLastMotionY - y; + if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) { + final ViewParent parent = getParent(); + if (parent != null) { + parent.requestDisallowInterceptTouchEvent(true); + } + mIsBeingDragged = true; + if (deltaY > 0) { + deltaY -= mTouchSlop; + } else { + deltaY += mTouchSlop; + } + } if (mIsBeingDragged) { // Scroll to follow the motion event - final int activePointerIndex = ev.findPointerIndex(mActivePointerId); - final int y = (int) ev.getY(activePointerIndex); - final int deltaY = mLastMotionY - y; mLastMotionY = y; final int oldX = mScrollX; |
