【Android】Scroller分析


mScroller.getCurrX() //獲取mScroller當前水平滾動的位置
mScroller.getCurrY() //獲取mScroller當前豎直滾動的位置
mScroller.getFinalX() //獲取mScroller最終停止的水平位置
mScroller.getFinalY() //獲取mScroller最終停止的豎直位置
mScroller.setFinalX(int newX) //設置mScroller最終停留的水平位置,沒有動畫效果,直接跳到目標位置
mScroller.setFinalY(int newY) //設置mScroller最終停留的豎直位置,沒有動畫效果,直接跳到目標位置

//滾動,startX, startY為開始滾動的位置,dx,dy為滾動的偏移量, duration為完成滾動的時間
mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默認完成時間250ms
mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)

mScroller.computeScrollOffset() //返回值為boolean,true說明滾動尚未完成,false說明滾動已經完成。這是一個很重要的方法,通常放在View.computeScroll()中,用來判斷是否滾動是否結束。

  先上源代碼:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;

public class CustomView extends LinearLayout {

    private static final String TAG = "Scroller";

    private Scroller mScroller;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScroller = new Scroller(context);
    }

    //調用此方法滾動到目標位置
    public void smoothScrollTo(int fx, int fy) {
        int dx = fx - mScroller.getFinalX();
        int dy = fy - mScroller.getFinalY();
        smoothScrollBy(dx, dy);
    }

    //調用此方法設置滾動的相對偏移
    public void smoothScrollBy(int dx, int dy) {

        //設置mScroller的滾動偏移量
        mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
        invalidate();//這里必須調用invalidate()才能保證computeScroll()會被調用,否則不一定會刷新界面,看不到滾動效果
    }
    
    @Override
    public void computeScroll() {
    
        //先判斷mScroller滾動是否完成
        if (mScroller.computeScrollOffset()) {
        
            //這里調用View的scrollTo()完成實際的滾動
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            
            //必須調用該方法,否則不一定能看到滾動效果
            postInvalidate();
        }
        super.computeScroll();
    }
}

我們先來看一下,Scroller,這個對象里有startScroll方法 

void android.widget.Scroller.startScroll(int startX, int startY, int dx, int dy, int duration)
第一個參數是起始移動的x坐標值,第二個是起始移動的y坐標值,第三個第四個參數都是移到某點的坐標值,而duration 當然就是執行移動的時間。這個有什么用呢。要知道有什么用還得再看一個方法

boolean android.widget.Scroller.computeScrollOffset()

當startScroll執行過程中即在duration時間內, computeScrollOffset  方法會一直返回false,但當動畫執行完成后會返回返加true.

有了這兩個方法還不夠,我們還需要再重寫viewGroup的一個方法,

computeScroll 這個方法什么時候會被調用呢

官網上這樣說的

public void computeScroll ()

Since:  API Level 1

Called by a parent to request that a child update its values for mScrollX and mScrollY if necessary. This will typically be done if the child is animating a scroll using a Scroller object.

當我們執行ontouch或invalidate()或postInvalidate()都會導致這個方法的執行

所以我們像下面這樣調用,postInvalidate執行后,會去調computeScroll 方法,而這個方法里再去調postInvalidate,這樣就可以不斷地去調用scrollTo方法了,直到mScroller動畫結束,當然第一次時,我們需要手動去調用一次postInvalidate才會去調用 

轉自:http://www.cnblogs.com/lqminn/archive/2013/01/18/2867035.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM