Android Scroller的基本使用

Scroller

android 原生類,滾動器。

Scroller基礎知識

  • 滾動的動作由基類view的scrollTo(x,y) 和scrollBy(dx,dy)的兩個方法完成,scroller只是要根據滾動的起始位置和結束生成中間的過度動畫。來形成一個滾動的動畫。
  • 注意:scroller類需要與容器類進行配合才能產生滾動的過程,

因爲一個View在容器(比如ViewGroup)中的滾動不是自身發起的動作,而是由父容器驅動容器內的子控件來完成,換句話說就是發生滾動效果的是組件的內容。例如在ViewGroup中使用Scroller,移動的是所有子View。但如果在TextView中使用,那麼移動的將是TextView中的文本。

scrollTo()與ScrollBy()

都是對view進行滑動
- scrollTo(int x,int y)滑動到終點位置(x,y)
- scrollBy(int dx,int dy),使view進行相對滑動,橫向滑動距離爲dx,樹向距離爲dy。起始調用了scrollTo的方法。

Scroller的基本使用

  1. public void startScroll(int startX,int startY,int dx,int dy)
  2. public void startScroll(int startX,int startY,int dx,int dy,int duration)
  3. public void abortAnimation()
  4. public final void forceFinished(boolean finished)
  5. public final int getCurrX()
  6. public final int getCurrY()
  7. public boolean computeScrollOffset()

簡單MyScrollToByLayout

public class MyScrollToByLayout extends ViewGroup {
    private Button btn1,btn2;
    private Scroller mScroller;
    ......
    public MyScrollToByLayout(Context context, AttributeSet attrs, int  defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mScroller=new Scroller(context);
   btn1=new Button(context);
    btn2=new Button(context);            //新建兩個Button實例btn1,btn2
    btn1.setText("Button1");
    btn2.setText("Button2");
    addView(btn1);
    addView(btn2);                        //將兩個Button添加到當前layout中
    btn2.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
                                mScroller.startScroll(getLayout().getScrollX(),getLayout().getScrollY(),
                                 (int)btn2.getX(),(int)btn2.getY(),10000);
            postInvalidate();
        }
    });
}
.......
@Override
public void computeScroll(){
  if(mScroller.computeScrollOffset()){
     this.scrollTo(mScroller.getCurrX(),mScoller.getCurrY());
     postInvalidate();
  }
}

public MyScrollToByLayout getLayout(){
   return this;
}

public Scroller getScroller(){
   return this.mScroller;
}

}`

總結

 平滑滾動的基本工作流程我們可以總結爲:

調用Scroller對象的startScroll()方法定義滾動的起始位置和滾動的距離

通過invalidate()或postInvalidate()方法刷新,調用draw(Canvas canvas)方法重繪組件

調用computeScroll()計算下一個位置的座標

再次調用invalidate()或postInvalidate()方法刷新重繪

判斷computeScroll()方法的返回值,如果爲false表示結束滾動,爲true表示繼續滾動

上面的步驟其實構建了一個方法調用循環:1–>2–>3–>4–>5–>3–>4–>5–>……,而3–>4–>5就是一個循環,該循環用於不斷計算下一個位置,並通過重繪移動到該位置,這樣就產生了動畫效果。同時我們應該注意到computeScroll()是個空方法來的,我們必須要重寫該方法才能實現平滑滾動。

參考:http://www.jianshu.com/p/3482a9e0ca65

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