前言
试想一下,我们希望 ScrollView
平滑滚动的操作时候,是怎么实现的呢?
我们可以猜想下,当我们的调用 smoothScrollBy(int dx, int dy)
的时候,ScrollView
是怎么就能实现平滑移动的呢?
smoothScrollBy执行过程
在MotionEvent.ACTION_UP事件触发时调用startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量
马上调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行
紧接着会调用 View.computeScroll()
方法,此方法是空实现,需要自己处理逻辑。具体逻辑是:先判断 Scroller.computeScrollOffset()
,若为true(表示滚动未结束),则执行 scrollTo()
方法,它会再次调用 postInvalidate()
,如此反复执行,直到返回值为false。流程图如下:
其中,最重要的两个方法是 startScroll()
和 computeScroll()
。
Fling执行过程
public boolean computeScrollOffset() {
int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
final float x