理解
我把scroller理解为滚动数据携带器,他只是一个记录滚动数据的工具,并不显示view的滚动效果,其实这点我觉得和安卓的属性动画挺像,他只提供数据,具体要怎么做,就看你的了。
scroller的两个重要方法
1.mScroller.startScroll(0, 0, 0, 0, 1000)
前面的两个参数是起始坐标x,y,中间两个参数是对应的偏移量,最后一个参数是执行时间。
2.mScroller.computeScrollOffset()
判断是否完成滚动,这个函数会一直返回false,直到滚动完毕返回true。
获取Scroller携带的位置数据
mScroller.getCurrX() //获取mScroller当前水平滚动的位置
mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
mScroller.getFinalX() //获取mScroller最终停止的水平位置
mScroller.getFinalY() //获取mScroller最终停止的竖直位置
mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置
mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置
使用
ViewGroup中有个computeScroll方法,ontouch或invalidate()或postInvalidate()都会导致这个方法的执行,
所以我们可以手动执行ViewGroup方法,同时再computeScroll中执行postInvalidate(),这就会形成一个循环,我们在这个循环中调用ViewGroup的scrollTo方法更新位置信息,同时使用mScroller.computeScrollOffset()方法监听滚动是否完毕。
public class MyView extends LinearLayout {
private boolean s1 = true;
Scroller mScroller = null;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(context);
// TODO Auto-generated constructor stub
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
postInvalidate();
}
}
//需要手动执行这个方法
public void beginScroll() {
if (!s1) {
mScroller.startScroll(0, 0, 0, 0, 1000);
s1 = true;
} else {
mScroller.startScroll(0, 0, 500, 0, 1000);
s1 = false;
}
invalidate();
}