实现方式
一、Scroller
Scroller典型的使用方法:
Scroller mScroller = new Scroller(mContent);
private void smoothScrollerTo(int destX, int destY){
int scrollX = getScrollX();
int deltaX = destX - scrollX;
mScroller.startScroll(scrollX, 0 ,deltaX, 0 ,1000);
invalidate();//导致View重绘,调用draw的computeScroll方法
}
//View的draw方法中调用
publis void computeScroll(){
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();//导致View再次重绘,调用draw的computeScroll方法
}
}
Scroller工作原理:Scroller本身并不能实现View的滑动,它需要配合View的computeScroll方法才能完成弹性滑动的效果,不断地让View重绘,而每一次重绘距离滑动起始时间有一个时间间隔,通过这个时间间隔Scroller就可以得到View当前的滑动位置(时间的百分比得到可移动距离),知道了滑动位置就可以通过scrollTo方法来完成View的滑动。这样每次View重绘都会导致View进行小幅度的滑动,而多次小幅度的滑动就组成了弹性滑动。
这里的滑动指的是View内容的滑动,而并非View本身位置的改变
二、动画
final int startX = 0;
final int deltaX = 100;
ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(100);
animator.addUpdateListener(new AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animator){
float fraction = animator.getAnimatedFraction();
mButton1.scrollTo(startX +(int)(deltaX * fraction),0);
}
});
animator.start();
在动画的每一帧到来时获取动画完成的比例,然后再根据这个比例计算出当前View所要滑动的距离。实质上还是采用scrollTo来完成滑动,所以滑动的依旧是View的内容而并非View本身。可以发现,这个方法与Scroller比较类似,都是通过改变一个百分比配合scrollTo方法来完成View的滑动。
三、使用延时策略
通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的postDelayed方法,也可以使用线程的sleep方法。对于postDelayed方法,可以通过它来延时发送一个消息,然后在消息中来进行View的滑动,如果接连不断地发送这种延时消息,那么就可以实现弹性滑动的效果。对于sleep方法,通过在while循环中不断地滑动View和sleep,就可以实现弹性滑动的效果。