上篇说到,可以使用scrollBy和scrollTo移动View,这里产生一个问题,加入一个View在屏幕的左上角即(0,0)位置,他调用
scrollTo(-300,-300)时,会立即跳过去,显得很突兀,如何让他平缓地划过去呢?就可以用本篇的方法了。
使用方法:
int startX;//滑动动作的起始点x坐标
int startY;//滑动动作的起始点y坐标
int dx; //x轴偏移量向左为负,向右为正(即负值向右移,正值向左移)
int dy; //y轴偏移量向左为负,向右为正(即负值向右移,正值向左移)
int duration;//时间,默认为250ms
注意:这里的dx和dy和上篇的scrollBy的参数相似,都是往哪个地方移动了多少,而不是往哪个点移动
Scroller mScroller=new Scroller(context);
mScroller.startScroll(startX,startY,dx,dy);
invalidate();//
除了上面的代码之外,还得重写View的computeScroll方法:
这里我的理解是:判断某一阶段滑动完成,就调用scrollTo方法,实现真正的移动
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
super.computeScroll();
}
可能大家还有点不明白,我还是来画图吧:
开发之Scroller.startScroll()方法简介-scroller.startscroll">
一个view,距离上边300px,距离左边300px,即他的坐标为(300,300);
那么这个时候,我们希望他从当前的这个位置,缓慢移动到(0,0),用时1秒,就这么写:
mScroller.startScroll(-300, -300, 300, 300,1000);
假设我们希望它从(300,300)移动到(100,100):
mScroller.startScroll(-300, -300, 200, 200,5000);
假设我们希望它从(300,300)移动到(200,200):
mScroller.startScroll(-300, -300, 100, 100,5000);
这样只是移动某段距离,那我们怎么样使它移动到一个固定的点呢?
我们可以这样做:假设我们想要移动到(100,100):
mScroller.startScroll(-300, -300, 0, 0, 500);
mScroller.setFinalX(100);
mScroller.setFinalY(100);
invalidate();
我为什么这样写呢?是有依据的,看一下startScroll的源码:
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
mMode = SCROLL_MODE;
mFinished = false;
mDuration = duration;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartX = startX;
mStartY = startY;
mFinalX = startX + dx;
mFinalY = startY + dy;
mDeltaX = dx;
mDeltaY = dy;
mDurationReciprocal = 1.0f / (float) mDuration;
}
其中:
mFinalX = startX + dx;
mFinalY = startY + dy;
就是把我们传进去的几个值加了一下,意思就是,我们传的dx,dy,就是我们移动的偏移量,受到起始数值的约束,
所以我们单独操控mFinalX、mFinalY就可以了.
最后解释一下computeScroll方法:
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
super.computeScroll();
}
首先把上面的例子拿来:
mScroller.startScroll(-300, -300, 300, 300,1000);
在(300,300)点,用时一秒,移动到(0,0),我们想一下,在一秒内完成这个操作,假设我们细分成100部分,即一部分为10ms,
那么在第一个10ms, mScrollerd的getCurrX()就是-300+3=-270,getCurrX同理,即第一个10ms后,view需要向左边移动了3px,这个时候computeScroll调用了,我们先判断一下mScroller的第一个阶段是不是完成了,假设完成了,就调用scrollTo()方法。
这样经过100个部分,在我们看来,就是缓慢的移动过去了.