今天公司有个需求,需要左右滚动停止后,item进行复位。
个人心得记录,也许错误很多,还望留言指正
1、scrollTo 是瞬间跳过去的,但是如果每次 To的距离很近,且动作很快,看起来就像是很连贯的动画,这个类似于快速翻阅连环画那个
2、Scoller 这个类并不直接参与滚动,它只是一个辅助计算的工具。
举例:
一、轻触滚动,也就是慢慢滚动
当手指抬起时,也就是 UP事件结束的时候,这时候假如 控件 滚动到了 100,但是你的需求是需要当手指抬起时,让控件慢慢滚动到 150。如果直接用 scrollTo就会直接跳过去,没有动画效果。
1、在 UP 事件内,调用 scroller.startScroll(curX, 0, moveWidth, 0); 第一个参数 是你开始 滚动的位置X,第二个是 开始滚动的 Y,第三个是你要 滚动的距离X,第四个是你要滚动的距离Y 如上面 则写成
scroller.startScroll(curX, 0, moveWidth, 0);
invalidate();
也就是沿着X轴滚动 50
2、这时候View会去调用 computeScroll() 这个方法,这个方法是需要重写的。在这个方法里面,我们可以进行 scrollTo的操作
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
//执行 scrollTo
//scroller.getCurrX() 获取当前滚动到的X轴坐标
invalidate();
}
}
二、如果你需要快速滑动,也就是飞起的那个感觉
先创建可以对事件进行速率计算的对象,下面代码放在 Down事件 之前
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
velocityTracker.addMovement(ev);
velocityTracker.computeCurrentVelocity(1000);
float velocityX = velocityTracker.getXVelocity();
float velocityY = velocityTracker.getYVelocity();
velocityTracker.recycle();
velocityTracker = null;
我看有不少代码 执行 velocityTracker = null ,不知道为什么,我也没用测
Math.abs(velocityX) > 50
scroller.fling(int startX, int startY, int velocityX, int velocityY,int minX, int maxX, int minY, int maxY));
invalidate();
return true;
这时候会去调用 computeScroll() 这个方法,我们可以对 fling 做个标记位,如果是 fling 触发的 computeScroll,那么当 scroller.computeScrollOffset() 等于 false时,也就是控件停下来时,再进行一次复位。
具体方法解释可以看这个网址
http://www.360doc.com/content/13/1219/17/11537979_338452870.shtml