OSDN Git Service

Don't bounce programmatic scrolls of ScrollView and HorizontalScrollView.
authorAdam Powell <adamp@google.com>
Fri, 29 Jan 2010 01:24:56 +0000 (17:24 -0800)
committerAdam Powell <adamp@google.com>
Fri, 29 Jan 2010 01:25:29 +0000 (17:25 -0800)
core/java/android/widget/HorizontalScrollView.java
core/java/android/widget/ScrollView.java

index 8c39231..0078fec 100644 (file)
@@ -821,10 +821,13 @@ public class HorizontalScrollView extends FrameLayout {
         }
         long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
         if (duration > ANIMATED_SCROLL_GAP) {
-            int width = getWidth() - mPaddingRight - mPaddingLeft;
-            int right = getChildAt(0).getWidth();
-            mScroller.startScroll(mScrollX, mScrollY, dx, dy,
-                    0, Math.max(0, right - width), 0, 0);
+            final int width = getWidth() - mPaddingRight - mPaddingLeft;
+            final int right = getChildAt(0).getWidth();
+            final int maxX = Math.max(0, right - width);
+            final int scrollX = mScrollX;
+            dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;
+
+            mScroller.startScroll(scrollX, mScrollY, dx, 0);
             awakenScrollBars(mScroller.getDuration());
             invalidate();
         } else {
index 1a50f85..4a1d871 100644 (file)
@@ -823,10 +823,13 @@ public class ScrollView extends FrameLayout {
         }
         long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
         if (duration > ANIMATED_SCROLL_GAP) {
-            int height = getHeight() - mPaddingBottom - mPaddingTop;
-            int bottom = getChildAt(0).getHeight();
-            mScroller.startScroll(mScrollX, mScrollY, dx, dy,
-                    0, 0, 0, Math.max(0, bottom - height));
+            final int height = getHeight() - mPaddingBottom - mPaddingTop;
+            final int bottom = getChildAt(0).getHeight();
+            final int maxY = Math.max(0, bottom - height);
+            final int scrollY = mScrollY;
+            dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;
+
+            mScroller.startScroll(mScrollX, scrollY, 0, dy);
             awakenScrollBars(mScroller.getDuration());
             invalidate();
         } else {