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

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