scrollBy和scrollTo这个两区别,其实我觉得很简单,下面给出一个基本示意图:
scrollTo(intabsoluteX,int absoluteY)
执行N次 :
从上面可知,上面的始终是相对第一次的位置坐标移动
scrollBy(intdeltaX,int deltaY)
执行第一次 :
再执行一次 :
后面的一次类推!
从上面看,位置将不断的发生变化.
从上面可知,上面的始终是相对上一次的位置坐标移动,请注意上一次和第一次的区别.
还是用同样这个专题的同一个工程,调整DurianLinearLayout.java,自己实现:
private Scroller mScroller;
mScroller = new Scroller(context, new DecelerateInterpolator(2.0F));
第二个参数是View移动加速效果设置,即移动越来越快,或者越来越慢等效果.
@Override
public void computeScroll() {
// TODO Auto-generated method stub
super.computeScroll();
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
}
}
mLinearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mScroller.startScroll(0, 0, -300, 0, 600);
// scrollTo(250, 0);
// scrollBy(50, 0);
postInvalidate();
}
});
运行效果:移动后的效果
程序在处理按钮事件时:
mScroller.startScroll(0, 0, -300, 0, 600);
但是不会立即刷新,这个时候还需要通知父容器,刷新:
postInvalidate();
通知刷新以后,开始执行下面的实现方法.看android源代码,父类中的这个方法是空的,最终是需要子类实现的
@Override
public void computeScroll() {
// TODO Auto-generated method stub
super.computeScroll();
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
}
}
然后将上面的程序重新调整:
mLinearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// mScroller.startScroll(0, 0, -300, 0, 600);
scrollTo(250, 0);
// scrollBy(50, 0);
// postInvalidate();
}
});
然后将上面程序继续调整:
mLinearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// mScroller.startScroll(0, 0, -300, 0, 600);
// scrollTo(250, 0);
scrollBy(50, 0);
postInvalidate();
}
});
再点击几次:
根据上面的测试结果,和前面分析的是一致的.