我也不知道怎么就稀里糊涂的看起来Android UI方面的东东了,偶尔感到无聊就看不下去了。开个博客记录一下吧,以后忘记了也方便翻一翻。
Scroller在android.widget包下,但是它本身却没有关于UI绘画的东东。个人认为其是一个辅助类,用于其他View的绘画。
Scroller的使用很简单:
1.初始化Scroller对象;
2.调用Scroller的Scroller的startScroll方法。
3.调用Scroller的computeScrollOffset方法来更新Scroller的mCurrX和mCurrY值。这两个值是对我们有用的,其标记了我们设定的位置变化轨迹。每调用一次该方法,坐标会更新一次,直到该值已经变化为我们指定的最终位置。当然,变化过程是在一个指定时间内完成的,默认为250毫秒。
看一下代码
public class MainActivity extends Activity implements View.OnClickListener{
private Scroller mScroller = null;
private TextView tv = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mScroller = new Scroller(this);
tv = new TextView(this){
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
tv.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
}
tv.invalidate();
}
};
tv.setText("click me!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2");
tv.setLayoutParams(new LayoutParams(100, 50));
tv.setSingleLine();
tv.setClickable(true);
tv.setOnClickListener(this);
setContentView(tv);
}
public void onClick(View arg0) {
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), 10, 0);
tv.invalidate();
}
}
mScroller.startScroll的调用可以在任何需要的地方,就如前面所说,Scroller本身和我们需要的View的绘制没有任何直接关系,所以咋一看,不明白这个调用有什么用。其实,它就是来告诉Scroller对象开始计算一系列插值,形成一系列的变化轨迹。
mScroller.startScroll调用后,会紧接着激活我们要重新绘制的View(这里是textview),这个是一个关键。
在基类View中有一个空函数public void computeScroll() { },所以我们可以在任何子类中重写该方法。computeScroll()会在View的绘制和更新中被调用到,用于计算绘制的坐标。这样的话,我们就可以将Scroller一些列的变化值,一次通过该函数传递给View用于其重绘。
但是我们可以看到computeScroll是没有参数的,它仅仅是提供了一个接口来使我们可以在绘制前有时间做处理,而这里我么需要使用View的scrollTo方法,来将Scroller的实时轨迹传递进去,看源码可以发现,View中有protected int mScrollX和mScrollY两个成员变量,这就是scrollTo传进来的值保存的地方。
对于上面代码的流程,我们可以简单的理解为:
1.Scroller.startScroll开始位置轨迹的计算
2.Scroller.computeScrollOffset()用于更新运动轨迹的记录值
3.Scroller.getCurrX()用于获取当前的运动轨迹值
4.View.computeScroll()用于在View绘制前更新绘制的坐标。当然这是一个连续的动作,需要不断的调用invalidate来激活重绘,知道computeScrollOffset返回false值,标志着已经移动到指定的位置了。