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(); } });
再点击几次:
根据上面的测试结果,和前面分析的是一致的.