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的最大距离,当达到这个距离后,就不能再继续进行滑动了。抬起手指后就进行回缩。
这个方法也可以用来检测是否滚动到了临界位置。

浙公网安备 33010602011771号