View有scrollTo、scrollBy方法,但是滑動是瞬時的,比較僵硬。可以通過Scroller來實現View的彈性滑動。
ScrollView就有smoothScrollTo和smoothScrollBy方法,這兩個方法實現的就是彈性滑動的效果,它們內部實際也是用了Scroller。
Scroller的典型使用方法:
private Scroller mScroller = new Scroller(getContext());
private void smoothScrollTo(int destX, int destY, int scrollTime){
mScroller.startScroll(getScrollX(), getScrollY(), destX - getScrollX(), destY - getScrollY(), scrollTime);
invalidate();
}
@Override
public void computeScroll() {
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
上述代碼就能實現慢慢滑動的彈性效果,爲什麼呢?
從源碼看,startScroll這個方法內部其實什麼也沒有做,只是保存了傳遞的參數:invalidate方法會使view重繪,view的draw方法會去調用computeScroll方法,我們複寫了這個方法,在裏面調用了computeScrollOffset,這個函數的意義是根據當前時間的流逝計算出當前的scrollX和scrollY應該是多少(根據之前startScroll所傳入的時間),如果這個方法返回true,證明滑動還沒有結束。所以只要判斷還在滑動,就調用scrollTo,滑動到當前的scrollX和scrollY的位置,然後再調用postInvalidate,又會使得view重繪,然後再次調用computeScroll方法,直到computeScrollOffset返回false滑動結束。
因此,Scroller本身其實並不能使view滑動,還需配合view的computeScroll方法才能實現。