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的基本使用
- public void startScroll(int startX,int startY,int dx,int dy)
- public void startScroll(int startX,int startY,int dx,int dy,int duration)
- public void abortAnimation()
- public final void forceFinished(boolean finished)
- public final int getCurrX()
- public final int getCurrY()
- 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()是個空方法來的,我們必須要重寫該方法才能實現平滑滾動。