1.通过Scroller
Sroller本身并不能实现View的滑动,它需要配合View的computeScroll方法才能完成弹性滑动的效果,它不断地让View重绘,而每一次重绘距滑动起始时间有一个时间间隔,通过这个时间间隔Scroller就可以得出View当前的滑动位置,知道了滑动位置就可以通过scrollTo方法来完成View的滑动。就这样,View的每一次重绘都会导致View进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动这就是Scroller的工作机制。
2.通过动画
final int startX = 0;
final int startY = 0;
ValueAnimator animator =
ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new
AnimatorUpdateListener(){
@override
public void
onAnimationUpdate(ValueAnimator animator){
float fraction
=animator.getAnimatedFraction();
mButton1.scrollTo(startX + (int)
(deltaX * fraction),0);
}
})
animator.start();
注意,以上的滑动针对的是View的内容而非View本身。
3.使用延时策略
它的核心思想是通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的postDelayed方法,也可以使用线程的sleep方法。对于postDelayed方法来说,我们可以通过它来延时发送一个消息,然后在消息中来进行View的滑动,如果接连不断地发送这种延时消息,那么就可以实现弹性滑动的效果。对于sleep方法来说,通过while循环中不断地滑动View和sleep就可以实现弹性滑动地效果。
下面采用Handler来做个示例。
private static final int
MESSAGE_SCROLL_TO=1;
private static final int
FRAME_COUNT=30;
private static final int
DELAYED_TIME=33;
private int mCount =0;
@SuppressLint("HandlerLeak")
private Handler mHandler= new
Handler(){
public void handlerMessage(Message
msg){
switch(msg.what){
case MESSAGE_SCROLL_TO:
mCount++;
if(mCount <=FRAME_COUNT){
float fraction =mCount / (float)
FRAME_COUNT;
int scrollX = (int)(fraction *
100);
mButton1.scrollTo(scrollX , 0);
mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO,DELAYED_TIME);
}
break;
}
};
};