【Android】Scroller分析


綜合兩篇博客: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()

當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才會去調用 


免責聲明!

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



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