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()是个空方法来的,我们必须要重写该方法才能实现平滑滚动。