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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章