1. 程式人生 > >使用Scroller實現View的彈性滑動

使用Scroller實現View的彈性滑動

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方法才能實現。