android中的scroll一般是调用view.scrollto()函数实现的,另外有一个view.scrollby()其实现也是view.scrollto()。关于view.scrollto(),下面有一些问题来探究一下,本文所查看的代码是android4.2.2的源代码。
问:view.scrollto()的原理是什么?
答:在android.view.view.java中有两个变量mscrollx和mscrolly,两个变量的定义如下:
在view的绘制过程中,会根据这两个值对里面的内容进行偏移。view.draw()中的代码片段如下:
在view.scrollto()的作用就是就是改变这两个变量,从而引起view的content位置发生变化。
问:scroll是否引起layout的改变?
答:scroll只是改变view.mscrollx和view.mscrolly,并且在draw()函数中,根据这两个偏移量进行绘制。所以只是影响draw(),不会引起layout的改变。
问:如果scroll只是在绘制的时候进行偏移,那么对touch事件的派发是否产生影响,view事件的响应是在scroll前的位置还是scroll后的位置?
答:事件的分派是在viewgroup.dispatchtouchevent()中,查看源码,发现在寻找响应事件的子view时,会算上mscrollx和mscrolly的偏移。所以scroll是会对事件派发产生影响的。view事件的响应是在scroll后的位置。关键代码如下:
问:scroller的作用是什么?
答:scroller的作用是帮助scroll更加顺滑的。如果我们不是想在一段时间内,有a点顺滑的scroll到b点。这样我们就要计算每次draw应该偏移多少,才能达到顺滑的效果。scroller就是用来帮助计算的。具体的计算方式是在scroller.computescrolloffset()函数中。代码如下:
问:scroll和valueanimator的区别是什么?
答:valueanimator的本质是在一段时间内,按照一定的规律去改变一个值。而scroll就是改变mscrollx和mscrolly的值。所以理论上也可以用valueanimator来改变mscrollx和mscrolly,从而达到scroll的目的。
问:scroll和animation的区别是什么?
答:animation也是通过在draw函数里面实现的,但是animation只是改变了绘制的位置,并没有影响到事件的响应。所以当一个view从a点通过animation动画移动到b点,view的事件继续在a点才能响应。