最简单的方式实现ListView 拉出回弹效果,阻尼效果
- 首先说一下坑
- 简介
- 实现
首先说一下坑
Android 9 之后才新增的API.
简介(overScrollBy方法,只要带滑动的都有此方法)
1. 在View中增加了overScrollBy方法,用于记录x, y 轴上滚动的距离 2. 在AbsListView的onTouchEvent中判断是否到达边界(顶部 或 底部) ,然后调用view.overScrollBy ,传入 mScrollY等参数 3. overScrollBy 最终赋值给View的mScrollX, mScrollY 两个变量 4. 在AbsListView中调用完overScrollBy之后,调用invalidate重绘
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考[Github][2].
实现(以ListView为例)
第一步:继承ListView,重写overScrollBy方法
说明:系统在此方法中没有做任何实现,只是实现了监听,自从5.0之后,Android官方加入了水泼纹效果,滑动到顶部或底部会出现水波纹效果。之所以没有做成和IOS下拉回弹那样的效果,是为了规避侵权。但是此方法其实已经做了实现。
public class PullToListView extends ListView{
private int mMaxOverScrollY = 200;//默认200
public PullToListView(Context context) {
super(context);
}
public PullToListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PullToListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 设置最大的回弹距离
* @param maxOverScrollY
*/
public void setMaxOverScrollY(int maxOverScrollY){
this.mMaxOverScrollY = maxOverScrollY;
}
/**
*
* @param deltaX 继续滑动x方向的距离
* @param deltaY 继续滑动y方向的距离 负:表示顶部到头 正:表示底部到头
* @param scrollX x方向滑动的距离
* @param scrollY y方法滑动的距离
* @param scrollRangeX
* @param scrollRangeY
* @param maxOverScrollX x方向最大可以滚动的距离
* @param maxOverScrollY y方向最大可以滚动的距离
* @param isTouchEvent 是手指拖动滑动 false:表示fling靠惯性滑动;
* @return
*/
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY,
maxOverScrollX, mMaxOverScrollY, isTouchEvent);
}
源码
代码实在是太简单了,就不上传了,详见下一篇,扩展篇