summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorMindy Pereira <mindyp@google.com>2010-10-13 15:23:41 -0700
committerMindy Pereira <mindyp@google.com>2010-10-13 16:21:10 -0700
commit22c5ff22822beefa4426015dafb42698cf535d94 (patch)
tree72e6d0918123ecc1b8eb88e85da1a255049c08d0 /core/java/android
parent07e1be62c7a8650313e7ad8690968c58ec8e88ad (diff)
Never show overscroll if the page scrolls at all.
Fixes b/3092852 Tune overscroll in web views that can scroll both horizontally and vertically Change-Id: I92cb6d1fa7d2034837654f2d2ddb7c3c997ce893
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/webkit/WebView.java89
1 files changed, 55 insertions, 34 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 8ee84dcf6692..040bf15ede2b 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -784,6 +784,11 @@ public class WebView extends AbsoluteLayout
private EdgeGlow mEdgeGlowBottom;
private EdgeGlow mEdgeGlowLeft;
private EdgeGlow mEdgeGlowRight;
+ /*
+ * These manage the delta the user has pulled beyond the edges.
+ */
+ private int mOverscrollDeltaX;
+ private int mOverscrollDeltaY;
// Used to match key downs and key ups
private boolean mGotKeyDown;
@@ -2569,17 +2574,59 @@ public class WebView extends AbsoluteLayout
boolean clampedY) {
mInOverScrollMode = false;
int maxX = computeMaxScrollX();
+ int maxY = computeMaxScrollY();
if (maxX == 0) {
// do not over scroll x if the page just fits the screen
scrollX = pinLocX(scrollX);
} else if (scrollX < 0 || scrollX > maxX) {
mInOverScrollMode = true;
}
- if (scrollY < 0 || scrollY > computeMaxScrollY()) {
+ if (scrollY < 0 || scrollY > maxY) {
mInOverScrollMode = true;
}
+ int oldX = mScrollX;
+ int oldY = mScrollY;
+
super.scrollTo(scrollX, scrollY);
+
+ // Only show overscroll bars if there was no movement in any direction
+ // as a result of scrolling.
+ if (mEdgeGlowTop != null && oldY == mScrollY && oldX == mScrollX) {
+ // Don't show left/right glows if we fit the whole content.
+ // Also don't show if there was vertical movement.
+ if (maxX > 0) {
+ final int pulledToX = oldX + mOverscrollDeltaX;
+ if (pulledToX < 0) {
+ mEdgeGlowLeft.onPull((float) mOverscrollDeltaX / getWidth());
+ if (!mEdgeGlowRight.isFinished()) {
+ mEdgeGlowRight.onRelease();
+ }
+ } else if (pulledToX > maxX) {
+ mEdgeGlowRight.onPull((float) mOverscrollDeltaX / getWidth());
+ if (!mEdgeGlowLeft.isFinished()) {
+ mEdgeGlowLeft.onRelease();
+ }
+ }
+ mOverscrollDeltaX = 0;
+ }
+
+ if (maxY > 0 || getOverScrollMode() == OVER_SCROLL_ALWAYS) {
+ final int pulledToY = oldY + mOverscrollDeltaY;
+ if (pulledToY < 0) {
+ mEdgeGlowTop.onPull((float) mOverscrollDeltaY / getHeight());
+ if (!mEdgeGlowBottom.isFinished()) {
+ mEdgeGlowBottom.onRelease();
+ }
+ } else if (pulledToY > maxY) {
+ mEdgeGlowBottom.onPull((float) mOverscrollDeltaY / getHeight());
+ if (!mEdgeGlowTop.isFinished()) {
+ mEdgeGlowTop.onRelease();
+ }
+ }
+ mOverscrollDeltaY = 0;
+ }
+ }
}
/**
@@ -5562,42 +5609,16 @@ public class WebView extends AbsoluteLayout
final int oldY = mScrollY;
final int rangeX = computeMaxScrollX();
final int rangeY = computeMaxScrollY();
- overScrollBy(deltaX, deltaY, oldX, oldY,
- rangeX, rangeY,
- mOverscrollDistance, mOverscrollDistance, true);
if (mEdgeGlowTop != null) {
- // Don't show left/right glows if we fit the whole content.
- if (rangeX > 0) {
- final int pulledToX = oldX + deltaX;
- if (pulledToX < 0) {
- mEdgeGlowLeft.onPull((float) deltaX / getWidth());
- if (!mEdgeGlowRight.isFinished()) {
- mEdgeGlowRight.onRelease();
- }
- } else if (pulledToX > rangeX) {
- mEdgeGlowRight.onPull((float) deltaX / getWidth());
- if (!mEdgeGlowLeft.isFinished()) {
- mEdgeGlowLeft.onRelease();
- }
- }
- }
-
- if (rangeY > 0 || getOverScrollMode() == OVER_SCROLL_ALWAYS) {
- final int pulledToY = oldY + deltaY;
- if (pulledToY < 0) {
- mEdgeGlowTop.onPull((float) deltaY / getHeight());
- if (!mEdgeGlowBottom.isFinished()) {
- mEdgeGlowBottom.onRelease();
- }
- } else if (pulledToY > rangeY) {
- mEdgeGlowBottom.onPull((float) deltaY / getHeight());
- if (!mEdgeGlowTop.isFinished()) {
- mEdgeGlowTop.onRelease();
- }
- }
- }
+ // Save the deltas for overscroll glow.
+ mOverscrollDeltaX = deltaX;
+ mOverscrollDeltaY = deltaY;
}
+
+ overScrollBy(deltaX, deltaY, oldX, oldY,
+ rangeX, rangeY,
+ mOverscrollDistance, mOverscrollDistance, true);
}
if (!getSettings().getBuiltInZoomControls()) {
boolean showPlusMinus = mMinZoomScale < mMaxZoomScale;