一 Android 9 之后才新增的API. 原理是
1. 在View中增加了overSrollBy方法,用于记录x, y 轴上滚动的之
2. 在AbsListView的onTouchEvent中判断是否到达边界(顶部 或 底部) ,然后调用view.overScrollBy ,传入 mScrollY等参数
3. overScrollBy 最终赋值给View的mScrollX, mScrollY 两个变量
4. 在AbsListView中调用完overScrollBy之后,调用invalidate重绘
二 下面是一个直接使用API的例子
1. 自定义ListView
public class BounceListView extends ListView{ private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxYOverscrollDistance; public BounceListView(Context context){ super(context); mContext = context; initBounceListView(); } public BounceListView(Context context, AttributeSet attrs){ super(context, attrs); mContext = context; initBounceListView(); } public BounceListView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); mContext = context; initBounceListView(); } private void initBounceListView(){ //get the density of the screen and do some maths with it on the max overscroll distance //variable so that you get similar behaviors no matter what the screen size final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); final float density = metrics.density; mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){ //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent); } }
2. Activity
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); setContentView(linearLayout); BounceListView bounceListView = new BounceListView(this); String[] data = new String[30]; for (int i = 0; i < data.length; i++) { data[i] = "天天记录 " + i; } ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data); bounceListView.setAdapter(arrayAdapter); linearLayout.addView(bounceListView); } }
资料:
Android Overscroll: Revisited
转载请注明出处:http://blog.csdn.net/love_world_/article/details/8155350
2013-04-08 更新,这种效果也叫“阻尼效果”