Scroller滚动类
系统自带的android.widget.Scroller 类封装了滚动相关的操作。可以使用Scroller获取可以产生滚动效果的数据;例如,在响应一个滑动手势时,Scroller会帮你计算 滚动偏移量,你可以根据获取的偏移量来设置你的view的位置,从而实现滚动效果。 主要方法有:
startScroll(int startX, int startY, int dx, int dy) //开始计算平滑滚动,dx、dy为滚动的距离,dx = finalX - startX;
fling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY) //根据滑动的速度,开始计算惯性滚动
computeScrollOffset()//计算当前时间滚动的偏移量,如果返回true,则滚动还未结束
getCurrY() //获取当前Y轴坐标的偏移量
getCurrX() //获取当前X轴坐标的偏移量
mScroller.abortAnimation() //停止滚动
在自定义View中常用的方法为:
// 开始计算平滑滚动
mScroller.startScroll(startX, startY, dx, dy);
// 调用invalidate()方法刷新view时,在绘制(onDraw)之前会调用view.computeScroll()方法,
// 所以在此方法内计算偏移量
public void computeScroll() {
if (mScroller.computeScrollOffset()) { // 正在滚动
int curY = mScroller.getCurrY();
int curX = mScroller.getCurrX();
// do something
invalidate(); // 刷新
}else{ // 滚动结束
// do something
}
}
在滚动选择器中,当手指滑动时,把滑动的距离赋值给mMoveLength,当手指抬起时,则调用Scroller.startScroll()方法,将当前item移动到中间位置;如果是快速滑动后抬起手指,则调用Scroller.fling()方法惯性滑动一段距离,惯性结束后再调用Scroller.startScroll()方法,将当前item移动到中间位置.
public void computeScroll() {
if (mScroller.computeScrollOffset()) { // 正在滚动
// 可以把scroller看做模拟的触屏滑动操作,mLastScrollY为上次滑动的坐标
mMoveLength = mMoveLength + mScroller.getCurrY() - mLastScrollY;
mLastScrollY = mScroller.getCurrY();
checkCirculation(); // 检测当前选中的item
invalidate();
} else { // 滚动完毕
if (mIsFling) {
mIsFling = false;
moveToCenter(); // 滚动到中间位置
} else if (mIsMovingCenter) { // 选择完成,回调给监听器
mMoveLength = 0;
mIsMovingCenter = false;
mLastScrollY = 0;
notifySelected();
}
}
}
|