summaryrefslogtreecommitdiff
path: root/core/java/android/widget/ScrollView.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2012-05-02 22:05:46 -0700
committerAdam Powell <adamp@google.com>2012-05-02 22:14:13 -0700
commitb3e02c44d57ac18d1debf21044289cf85d0dd672 (patch)
tree50d26abf8f8b0fd740e712543fea6b043a252918 /core/java/android/widget/ScrollView.java
parentfbbdbc2d2326e96ce31950baccddd2f295fe594c (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.java31
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;