Junior Farmer

真正了不起的程序员对自己程序的每一个字节都了如指掌
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Android: ScrollView监听滑动到顶端和底端

Posted on 2014-07-10 17:41  农少  阅读(1579)  评论(0编辑  收藏  举报

在项目中需要监听ScrollView滑动到顶端和底端的时候以实现自己的ScrollView,那么怎样去监听呢?今天查看了一下ScrollView的源码,找到了一种方法。先看一下源码中的overScrollBy()方法:

 1 protected boolean overScrollBy(int deltaX, int deltaY,
 2             int scrollX, int scrollY,
 3             int scrollRangeX, int scrollRangeY,
 4             int maxOverScrollX, int maxOverScrollY,
 5             boolean isTouchEvent) {
 6         final int overScrollMode = mOverScrollMode;
 7         final boolean canScrollHorizontal =
 8                 computeHorizontalScrollRange() > computeHorizontalScrollExtent();
 9         final boolean canScrollVertical =
10                 computeVerticalScrollRange() > computeVerticalScrollExtent();
11         final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS ||
12                 (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);
13         final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS ||
14                 (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);
15         int newScrollX = scrollX + deltaX;
16         if (!overScrollHorizontal) {
17             maxOverScrollX = 0;
18         }
19         int newScrollY = scrollY + deltaY;
20         if (!overScrollVertical) {
21             maxOverScrollY = 0;
22         }
23         // Clamp values if at the limits and record
24         final int left = -maxOverScrollX;
25         final int right = maxOverScrollX + scrollRangeX;
26         final int top = -maxOverScrollY;
27         final int bottom = maxOverScrollY + scrollRangeY;
28         boolean clampedX = false;
29         if (newScrollX > right) {
30             newScrollX = right;
31             clampedX = true;
32         } else if (newScrollX < left) {
33             newScrollX = left;
34             clampedX = true;
35         }
36         boolean clampedY = false;
37         if (newScrollY > bottom) {
38             newScrollY = bottom;
39             clampedY = true;
40         } else if (newScrollY < top) {
41             newScrollY = top;
42             clampedY = true;
43         }
44         onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);
45         return clampedX || clampedY;
46     }

此方法有9个参数,参数太多有点让人模糊。这里我们不管他们是什么意思,直接看36-43行代码,很显然这是一个垂直方向的边界检查,而这也正是我们想要的。因此我们可以重写此方法,在此方法中实现监听,代码如下:

 1  @Override
 2     protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
 3 
 4         int newScrollY = scrollY + deltaY;
 5         final int bottom = maxOverScrollY + scrollRangeY;
 6         final int top = -maxOverScrollY;
 7         if (newScrollY > bottom) {
 8             System.out.println("滑动到底端");
 9         }
10         else if (newScrollY < top) {
11             System.out.println("滑动到顶端");
12         }
13         return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
14     }

是不是很简单呢?