美文网首页
Android View的事件体系(三) 弹性滑动

Android View的事件体系(三) 弹性滑动

作者: BlingBest | 来源:发表于2019-01-11 15:41 被阅读102次

    弹性滑动


    知道了View的滑动,我们还要知道如何实现View的弹性滑动,比较生硬的滑动过去,这种方式的用户体验实在太差了,因此我们要实现渐进式滑动,那么如何实现弹性滑动?实现的方法有很多,但是它们都有一个共同思想:将一次大的滑动分成若干次小的滑动并在一个时间段内完成,弹性滑动的具体是西安方式有很多,比如通过Scroller,Handler#postDelayed以及Thread#Sleep.

    使用Scroller

    上面是Scroller的典型的使用方法,这里先描述它的工作原理,当我们构造一个Scroller对象并且调用它的startScroll方法时,Scroller内部其实什么也没做,它只是保持了我们传递的几个参数,这几个参数从startScroll的原型上就可以看出来

    startX和startY表示的是滑动的起点,dx和dy表示的是要滑动的距离,而duration表示的是滑动时间,即整个滑动过程完成所需要的时间,注意这里的滑动是指View内容的滑动而非View本身位置的改变,可以看到,仅仅调用startScroll方法是无法让View滑动的,因为它内部并没有做滑动相关的事,那么Scroller到底事怎么让View弹性滑动的?就是startScroll方法下面的invalidate方法,invalidate方法会导致View重绘,在View的draw方法中又会去调用computeScroll方法,computeScroll方法在View中是一个空实现,因此需要我们自己去实现,上面的代码已经实现了computeScroll方法,正是因为这个computeScroll方法,View才能实现弹性滑动.当View重绘后会在draw方法中调用computeScroll,而computeScroll又回去向Scroller获取当前的scrollX和scrollY;通过scrollTo实现滑动,接着又调用postIncalidate方法来进行第二次重绘,这一次重绘的过程和第一次重绘一样,还是会导致computeScroll方法被调用,然后继续向Scroller获取当前的scrollX和scrollY,并提供scrollTo方法滑动到新的位置.

    Scroller本身并不能实现View的滑动,它需要配合View的computeScroll方法才能完成弹性滑动的效果,它不断的让View重绘,而每一次重绘距滑动起始时间会有一个时间间隔,通过这个时间间隔Scroller就可以得出View当前的滑动位置,View的每一次重绘都会导致View进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动,这就是Scroller的工作机制

    通过动画

    动画本身就是一种渐进的过程,因此通过它来实现的滑动天然具有弹性效果,比如以下代码可以让一个View的内容在100ms内向左移动100像素

    在上述代码中,我们的动画本质上没有作用于任何对象上,它只是在1000ms内完成了整个动画过程,利用这个特性,我们就可以在动画的每一帧到来时获取动画完成的比例,然后再根据这个比例计算出当前View所要滑动的距离.

    使用延迟策略

    它的核心思想是通过发生一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的postDelayed方法,也可以使用线程的sleep,对于postDelayed方法来说,我们可以通过它来延迟发送一个消息,然后在消息中来进行View的滑动,如果接连不断的发送这种延迟消息,那么就可以实现弹性滑动的效果,对于sleep方法来说,通过在while循环中不断的滑动View和sleep,就可以实现弹性滑动的效果

    相关文章

      网友评论

          本文标题:Android View的事件体系(三) 弹性滑动

          本文链接:https://www.haomeiwen.com/subject/gmyxdqtx.html