如何使ListView具有像ios一样的弹性

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     }

就这简单,其实他就是一个相当于动画的效果,没有下拉刷新上啦加载的效果,要想实现,还是需要我们自己定义滴,或者使用开源的三方框架!!

 

posted @ 2016-01-20 15:13  笨笨丫头~双  阅读(421)  评论(0编辑  收藏  举报