首页 > 代码库 > Android: ScrollView监听滑动到顶端和底端
Android: ScrollView监听滑动到顶端和底端
在项目中需要监听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 record24 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 }
是不是很简单呢?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。