android 简单实现带有弹性的ListView,ScrollView,HorizontalView等

前言:现在的内容加载容器中,当滑动到顶部临界位置的时候,如果继续进行手指滑动,内容部分会继续滑动,当抬起手指后内容部分会回滚到初始位置。这就形成了一个弹性的效果

  之前有两篇随笔介绍了弹性效果:

  ScrollView弹性:http://www.cnblogs.com/liangstudyhome/p/4152226.html

  ListView弹性:http://www.cnblogs.com/liangstudyhome/p/4152228.html

1.原理:

  在android api9 过后再能滑动的容器当中加入了一个方法overScrollBy,通过这个方法就能形成弹性效果。

  原理可以参考该地址:http://my.oschina.net/oppo4545/blog/260738

2.代码实现:

  以ListView为例:

  

 1 public class BounceListView extends ListView {
 2 
 3     private static final int MAX_Y_OVERSCROLL_DISTANCE = 200;
 4     private Context mContext;
 5     private int mMaxYOverscrollDistance;
 6     // 阻尼参数
 7     private static final float a = 0.5f;
 8 
 9     public BounceListView(Context context) {
10         this(context, null);
11     }
12 
13     public BounceListView(Context context, AttributeSet attrs) {
14         this(context, attrs, 0);
15     }
16 
17     public BounceListView(Context context, AttributeSet attrs, int defStyle) {
18         super(context, attrs, defStyle);
19         this.mContext = context;
20         initBounceListView();
21     }
22 
23     private void initBounceListView() {
24 
25         final DisplayMetrics displayMetrics = mContext.getResources()
26                 .getDisplayMetrics();
27 
28         final float density = displayMetrics.heightPixels;
29 
30         mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
31 
32     }
33 
34     @SuppressLint("NewApi")
35     @Override
36     protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
37             int scrollY, int scrollRangeX, int scrollRangeY,
38             int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
39         System.out.println("overScrollBy方法各参数的值->" + "    deltaX->" + deltaX
40                 + "   deltaY->" + deltaY + "  scrollX->" + scrollX
41                 + "    scrollY->" + scrollY + "  scrollRangeX->" + scrollRangeX
42                 + "   scrollRangeY->" + scrollRangeY + "   maxOverScrollX->"
43                 + maxOverScrollX + " maxOverScrollY->" + maxOverScrollY);
44         return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
45                 scrollRangeX, scrollRangeY, maxOverScrollX, 200, isTouchEvent);
46     }
47 
48 }

设置垂直方法能overScrolle的最大距离,当达到这个距离后,就不能再继续进行滑动了。抬起手指后就进行回缩。

这个方法也可以用来检测是否滚动到了临界位置。

posted @ 2015-06-15 17:32  perfect亮  阅读(832)  评论(0)    收藏  举报