使用Scroller實現View的彈性滑動
阿新 • • 發佈:2018-12-30
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方法才能實現。