ListView 是我们在开发过程中经常使用的控件之一,通常情况下,当我们没有对它进行自定义或者给添加headerview 或者footerView的时候,他都没有一个很好的反馈效果,但是相比较而言,Ios的列表都具有弹性,也就是它的bounce功能,它容许用户将内容拖过界,甩手后再弹回来。但是android想要做到这些就需要自己重写listView来实现这样的一个效果,使用scrollView嵌套啊,或者添加headerView.其实有种很简单的方法,我们可以查看View的相关源码,其中有这样的一个方法
1.View类里面的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 16 int newScrollX = scrollX + deltaX; 17 if (!overScrollHorizontal) { 18 maxOverScrollX = 0; 19 } 20 21 int newScrollY = scrollY + deltaY; 22 if (!overScrollVertical) { 23 maxOverScrollY = 0; 24 } 25 26 // Clamp values if at the limits and record 27 final int left = -maxOverScrollX; 28 final int right = maxOverScrollX + scrollRangeX; 29 final int top = -maxOverScrollY; 30 final int bottom = maxOverScrollY + scrollRangeY; 31 32 boolean clampedX = false; 33 if (newScrollX > right) { 34 newScrollX = right; 35 clampedX = true; 36 } else if (newScrollX < left) { 37 newScrollX = left; 38 clampedX = true; 39 } 40 41 boolean clampedY = false; 42 if (newScrollY > bottom) { 43 newScrollY = bottom; 44 clampedY = true; 45 } else if (newScrollY < top) { 46 newScrollY = top; 47 clampedY = true; 48 } 49 50 onOverScrolled(newScrollX, newScrollY, clampedX, clampedY); 51 52 return clampedX || clampedY; 53 }
2.我们在看一下ListView 里面的overScrollBy方法
1 protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, 2 3 int scrollY, int scrollRangeX, int scrollRangeY, 4 5 int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { 6 7 L.d("deltaX=" + deltaX + ";deltaY=" + deltaY + ";scrollX=" + scrollX 8 9 + ";scrollY=" + scrollY + ";scrollRangeX=" + scrollRangeX 10 11 + ";scrollRangeY=" + scrollRangeY + ";maxOverScrollX=" 12 13 + maxOverScrollX + ";maxOverScrollY=" + maxOverScrollY); 14 15 return false; 16 17 }
这里maxOverScrollX、maxOverScrollY默认值是0,对于maxOverScrollY这个参数,注释是这样说明的Number of pixels to overscroll by in either direction along the Y axis.也就是说只要我们改变这个参数的值就可以了,
我们可以通过屏幕的density来计算具体的值,这样可以满足不同手机分辨率的需求,
1 private static final int DISTANCE = 200; 2 private int mMaxOverDistance; 3 DisplayMetricsmetrics=getContext().getResources().getDisplayMetrics(); 4 float density= metrics.density; 5 mMaxOverDistance=(int)(density*DISTANCE);
在在需要的listview里面重写overScrollBy方法
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 return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, 4 scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, 5 isTouchEvent); 6 7 8 9 }
就这简单,其实他就是一个相当于动画的效果,没有下拉刷新上啦加载的效果,要想实现,还是需要我们自己定义滴,或者使用开源的三方框架!!