綜合兩篇博客:Android Scroller簡單用法和android 使用Scroller實現緩慢移動
API:
1 mScroller.getCurrX() //獲取mScroller當前水平滾動的位置 2 mScroller.getCurrY() //獲取mScroller當前豎直滾動的位置 3 mScroller.getFinalX() //獲取mScroller最終停止的水平位置 4 mScroller.getFinalY() //獲取mScroller最終停止的豎直位置 5 mScroller.setFinalX(int newX) //設置mScroller最終停留的水平位置,沒有動畫效果,直接跳到目標位置 6 mScroller.setFinalY(int newY) //設置mScroller最終停留的豎直位置,沒有動畫效果,直接跳到目標位置 7 8 //滾動,startX, startY為開始滾動的位置,dx,dy為滾動的偏移量, duration為完成滾動的時間 9 mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默認完成時間250ms 10 mScroller.startScroll(int startX, int startY, int dx, int dy, int duration) 11 12 mScroller.computeScrollOffset() //返回值為boolean,true說明滾動尚未完成,false說明滾動已經完成。這是一個很重要的方法,通常放在View.computeScroll()中,用來判斷是否滾動是否結束。
先上源代碼:
1 import android.content.Context; 2 import android.util.AttributeSet; 3 import android.util.Log; 4 import android.view.View; 5 import android.widget.LinearLayout; 6 import android.widget.Scroller; 7 8 public class CustomView extends LinearLayout { 9 10 private static final String TAG = "Scroller"; 11 12 private Scroller mScroller; 13 14 public CustomView(Context context, AttributeSet attrs) { 15 super(context, attrs); 16 mScroller = new Scroller(context); 17 } 18 19 //調用此方法滾動到目標位置 20 public void smoothScrollTo(int fx, int fy) { 21 int dx = fx - mScroller.getFinalX(); 22 int dy = fy - mScroller.getFinalY(); 23 smoothScrollBy(dx, dy); 24 } 25 26 //調用此方法設置滾動的相對偏移 27 public void smoothScrollBy(int dx, int dy) { 28 29 //設置mScroller的滾動偏移量 30 mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); 31 invalidate();//這里必須調用invalidate()才能保證computeScroll()會被調用,否則不一定會刷新界面,看不到滾動效果 32 } 33 34 @Override 35 public void computeScroll() { 36 37 //先判斷mScroller滾動是否完成 38 if (mScroller.computeScrollOffset()) { 39 40 //這里調用View的scrollTo()完成實際的滾動 41 scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); 42 43 //必須調用該方法,否則不一定能看到滾動效果 44 postInvalidate(); 45 } 46 super.computeScroll(); 47 } 48 }
我們先來看一下,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()
有了這兩個方法還不夠,我們還需要再重寫viewGroup的一個方法,
computeScroll 這個方法什么時候會被調用呢
官網上這樣說的
public void computeScroll ()
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才會去調用