View实现弹性滑动

来源:互联网 发布:软件手术刀怎么用 编辑:程序博客网 时间:2024/06/05 13:50

实现方式
一、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,就可以实现弹性滑动的效果。