理解
我把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();
}