diff options
| author | Patrick Dubroy <dubroy@google.com> | 2011-05-05 14:59:35 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-05-05 14:59:35 -0700 |
| commit | b51cc1dd63808da505cd8beb7300f57dc98ff1d3 (patch) | |
| tree | 779c28c6094586e0d31447b0cd805d114552e915 /core/java/android | |
| parent | 8b1b0548b21e6d8fdfb769d9064cd2ff4232bc3d (diff) | |
| parent | e0a799a2ac1ca78e30fbac9e4e12a063425c08d3 (diff) | |
Merge "Only delay pressed feedback for Views inside a scrolling parent"
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/View.java | 55 | ||||
| -rw-r--r-- | core/java/android/view/ViewConfiguration.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 13 | ||||
| -rw-r--r-- | core/java/android/webkit/WebView.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/AbsoluteLayout.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/FrameLayout.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/LinearLayout.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/RelativeLayout.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/ScrollView.java | 5 |
9 files changed, 81 insertions, 19 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e47b499c0fb5..791ffb9da95f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5138,9 +5138,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility (mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) && (event.getRepeatCount() == 0)) { setPressed(true); - if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) { - postCheckForLongClick(0); - } + checkForLongClick(0); return true; } break; @@ -5535,12 +5533,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility break; case MotionEvent.ACTION_DOWN: - if (mPendingCheckForTap == null) { - mPendingCheckForTap = new CheckForTap(); - } - mPrivateFlags |= PREPRESSED; mHasPerformedLongPress = false; - postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); + + // Walk up the hierarchy to determine if we're inside a scrolling container. + boolean isInScrollingContainer = false; + ViewParent p = getParent(); + while (p != null && p instanceof ViewGroup) { + if (((ViewGroup) p).shouldDelayChildPressedState()) { + isInScrollingContainer = true; + break; + } + p = p.getParent(); + } + + // For views inside a scrolling container, delay the pressed feedback for + // a short period in case this is a scroll. + if (isInScrollingContainer) { + mPrivateFlags |= PREPRESSED; + if (mPendingCheckForTap == null) { + mPendingCheckForTap = new CheckForTap(); + } + postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); + } else { + // Not inside a scrolling container, so show the feedback right away + mPrivateFlags |= PRESSED; + refreshDrawableState(); + checkForLongClick(0); + } break; case MotionEvent.ACTION_CANCEL: @@ -11846,15 +11865,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } } - private void postCheckForLongClick(int delayOffset) { - mHasPerformedLongPress = false; + private void checkForLongClick(int delayOffset) { + if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) { + mHasPerformedLongPress = false; - if (mPendingCheckForLongPress == null) { - mPendingCheckForLongPress = new CheckForLongPress(); + if (mPendingCheckForLongPress == null) { + mPendingCheckForLongPress = new CheckForLongPress(); + } + mPendingCheckForLongPress.rememberWindowAttachCount(); + postDelayed(mPendingCheckForLongPress, + ViewConfiguration.getLongPressTimeout() - delayOffset); } - mPendingCheckForLongPress.rememberWindowAttachCount(); - postDelayed(mPendingCheckForLongPress, - ViewConfiguration.getLongPressTimeout() - delayOffset); } /** @@ -12166,9 +12187,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags &= ~PREPRESSED; mPrivateFlags |= PRESSED; refreshDrawableState(); - if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) { - postCheckForLongClick(ViewConfiguration.getTapTimeout()); - } + checkForLongClick(ViewConfiguration.getTapTimeout()); } } diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 94eb429dad64..36bb046c0f68 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -95,7 +95,7 @@ public class ViewConfiguration { * is a tap or a scroll. If the user does not move within this interval, it is * considered to be a tap. */ - private static final int TAP_TIMEOUT = 115; + private static final int TAP_TIMEOUT = 180; /** * Defines the duration in milliseconds we will wait to see if a touch event diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 7b8242df0474..35cca4f3b98a 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -4973,6 +4973,19 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } /** + * Return true if the pressed state should be delayed for children or descendants of this + * ViewGroup. Generally, this should be done for containers that can scroll, such as a List. + * This prevents the pressed state from appearing when the user is actually trying to scroll + * the content. + * + * The default implementation returns true for compatibility reasons. Subclasses that do + * not scroll should generally override this method and return false. + */ + public boolean shouldDelayChildPressedState() { + return true; + } + + /** * LayoutParams are used by views to tell their parents how they want to be * laid out. See * {@link android.R.styleable#ViewGroup_Layout ViewGroup Layout Attributes} diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f99d89587d56..0504532df526 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1194,6 +1194,11 @@ public class WebView extends AbsoluteLayout mHTML5VideoViewProxy = null ; } + @Override + public boolean shouldDelayChildPressedState() { + return true; + } + /** * Adds accessibility APIs to JavaScript. * diff --git a/core/java/android/widget/AbsoluteLayout.java b/core/java/android/widget/AbsoluteLayout.java index ac82af724bc9..7df6aabd7240 100644 --- a/core/java/android/widget/AbsoluteLayout.java +++ b/core/java/android/widget/AbsoluteLayout.java @@ -141,6 +141,11 @@ public class AbsoluteLayout extends ViewGroup { return new LayoutParams(p); } + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + /** * Per-child layout information associated with AbsoluteLayout. * See diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 590a76820bc3..0659063bbafe 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -485,6 +485,11 @@ public class FrameLayout extends ViewGroup { return new FrameLayout.LayoutParams(getContext(), attrs); } + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + /** * {@inheritDoc} */ diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 7838ec093f31..86fefafd89fd 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -201,6 +201,11 @@ public class LinearLayout extends ViewGroup { mShowDividers = showDividers; } + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + /** * @return A flag set indicating how dividers should be shown around items. * @see #setShowDividers(int) diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index a47359f8a6a4..906928308426 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -186,6 +186,11 @@ public class RelativeLayout extends ViewGroup { a.recycle(); } + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + /** * Defines which View is ignored when the gravity is applied. This setting has no * effect if the gravity is <code>Gravity.LEFT | Gravity.TOP</code>. diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index ade3a0aa94b8..27edb885cabe 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -162,6 +162,11 @@ public class ScrollView extends FrameLayout { } @Override + public boolean shouldDelayChildPressedState() { + return true; + } + + @Override protected float getTopFadingEdgeStrength() { if (getChildCount() == 0) { return 0.0f; |
