Android面试整理之UI部分——实现View的弹性滑动的三种方式(一)

来源:互联网 发布:金融行业 数据安全 编辑:程序博客网 时间:2024/06/04 19:43

一.使用Scroller

 

1.为什么有弹性滑动的需求?

   用View提供的原生方法scrollTo/scrollBy,虽然是专用于View的滑动,操作简单,能比较方便地实现滑动效果并且不影响内部元素的单击事件,但,其不仅具有“只能滑动View的内容,并不能滑动View本身”的缺点,而且因为这个过程是瞬间完成的,这个没有过渡效果的滑动用户体验不好。因此,需要使用弹性滑动来实现过渡效果的滑动,使其在一定的时间间隔内完成。

 

2.Scroller是怎么实现弹性滑动的(Scroller弹性滑动的工作原理)?

   Scroller本身无法让View滑动,它需要和View的computeScroll()方法配合使用才能共同完成弹性滑动的效果。因此,Scroller的工作机制可描述为:在View的smoothScrollTo()方法内部不断地让View重绘,而每一次重绘距离滑动起始时间都会有一个时间间隔,通过这个时间间隔Scroller就可以得出View当前的滑动位置,知道了滑动位置就可以通过scrollTo方法来完成View的滑动。就这样,View的每一次重绘都会导致View进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动。其中,在计算某一时刻View的当前滑动位置时,会调用computeScroll()方法,它是实现View弹性滑动的关键。

   为了更理解这个过程,首先看一下Scroller的源码:

 

   具体对工作原理进行分析:当我们构造出一个Scroller对象并调用它的startScroll方法时,Scroller内部除了保存传递的参数(起始点横纵坐标,水平和垂直方向的滑动距离,滑动持续时间)外,其实什么也没做。Scroller使View滑动的处理是:startScroll()方法下面的invalidate()方法,其会导致View重绘(调用View的onDraw()方法),而View的draw()方法又会去调用computeScroll()方法,computeScroll()需要我们自己去实现,这个方法才是实现View弹性滑动的关键。下图简要整理了该过程:

 

   事实上,Scroller实现弹性滑动的本质还是scrollTo()方法+细分滑动持续时间为一段段小的时间间隔。ComputeScroll()方法里有一个computeScrollOffset()方法,其会根据时间的流逝来计算出当前的位置坐标(scrollX,scrollY),计算方法:根据“时间的流逝/总的滑动持续时间”的百分比计算出水平方向和垂直方向上“改变的坐标距离(scrollX和scrollY)/总的滑动距离”的百分比,从而计算出当前的位置坐标值。下图可简要表示此过程:

 

Ps:此处所说的滑动均是指View内容的滑动,而非View本身位置的改变。

 

 

1 0