1. 程式人生 > >View實現彈性滑動

View實現彈性滑動

實現方式
一、Scroller
Scroller典型的使用方法:

Scroller mScroller = new Scroller(mContent);
private void smoothScrollerTo(int destX, int destY){
    int scrollX = getScrollX();
    int deltaX = destX - scrollX;
    mScroller.startScroll(scrollX, 0 ,deltaX, 0 ,1000);
    invalidate();//導致View重繪,呼叫draw的computeScroll方法
}

//View的draw方法中呼叫
publis void computeScroll(){ if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate();//導致View再次重繪,呼叫draw的computeScroll方法 } }

Scroller工作原理:Scroller本身並不能實現View的滑動,它需要配合View的computeScroll方法才能完成彈性滑動的效果,不斷地讓View重繪,而每一次重繪距離滑動起始時間有一個時間間隔,通過這個時間間隔Scroller就可以得到View當前的滑動位置(時間的百分比得到可移動距離),知道了滑動位置就可以通過scrollTo方法來完成View的滑動。這樣每次View重繪都會導致View進行小幅度的滑動,而多次小幅度的滑動就組成了彈性滑動。
這裡的滑動指的是View內容的滑動,而並非View本身位置的改變

二、動畫

final int startX = 0;
final int deltaX = 100;
ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(100);
animator.addUpdateListener(new AnimatorUpdateListener(){
    @Override
    public void onAnimationUpdate(ValueAnimator animator){
        float fraction = animator.getAnimatedFraction();
        mButton1.scrollTo(startX +(int
)(deltaX * fraction),0); } }); animator.start();

在動畫的每一幀到來時獲取動畫完成的比例,然後再根據這個比例計算出當前View所要滑動的距離。實質上還是採用scrollTo來完成滑動,所以滑動的依舊是View的內容而並非View本身。可以發現,這個方法與Scroller比較類似,都是通過改變一個百分比配合scrollTo方法來完成View的滑動。

三、使用延時策略
通過傳送一系列延時訊息從而達到一種漸進式的效果,具體來說可以使用Handler或View的postDelayed方法,也可以使用執行緒的sleep方法。對於postDelayed方法,可以通過它來延時傳送一個訊息,然後在訊息中來進行View的滑動,如果接連不斷地傳送這種延時訊息,那麼就可以實現彈性滑動的效果。對於sleep方法,通過在while迴圈中不斷地滑動View和sleep,就可以實現彈性滑動的效果。