上一篇说了View的几种滑动方式,但是哪几种方式滑动起来都比较生硬,没有弹性,这里介绍一种弹性滑动--Scroller。他的原理实际上就是:把一次大的滑动分成若干个小的滑动(而且这些每一次的小滑动并不是平均的,而是根据时间的流逝而起变化)。
Scroller mScroller = new Scroller(context);
//调用此方法渐进性滚动到目标位置
public void smoothScrollTo(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
//开始滚动
//但是实际上这个startScroll()内部并没有做和滑动相关的事,真正实现滑动的是下面的invalidate(),我们都知道这个函数是用来重绘界面的,它里面会调用到
//computeScroll(),所以就在 computeScroll()方法里实现小滑动,并且循环,直至实现大滑动
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
}
//调用invalidate()重绘的时候里面会调用到这个方法
@Override
public void computeScroll() {
//先判断大滑动mScroller滚动是否完成
if (mScroller.computeScrollOffset()) {
//这里调用View的scrollTo()完成实际的滚动(一次小滑动)
scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //这个CurrX,CurrY是在computeScrollOffset()计算的,即每一次的小滑动大小,它里面是随时间流逝变化的
//重绘
postInvalidate();
}
super.computeScroll();
}
}
可以看到Scroller实现弹性滑动的内部实现每一次的小滑动也是利用scrollTo()去完成的,所以Scroller实现渐进性滑动的原理正如开头所说的:把一次大的滑动分成若干个小的滑动(而且这些每一次的小滑动并不是平均的,而是根据时间的流逝而起变化)。
当然实现渐进性滑动并不是只有利用Scroller这一种方式,除此之外,我们还可以使用延时策略来达到目的,即设定每隔一小段时间来一次小滑动,最终完成一次大滑动,但是本质的原理都一样,就是化大滑动为小滑动,这样从视觉上就感觉滑动十分的平缓好看了。