某某的理解
Scroll只是一个滚动动作的动画插入器我们做的一个滚动的动作
分为两个 一个是scrolTo 一个是scrollBy 不管是什么动画 我们最终改变的还是通过父类进行操作 改变子类的scrollX 和scrollY进行操作之前computeScroll
这个函数中 public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();这个是点击后动画的效果 这个事通过调用
}
scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
invalidate();
每一个窗口打开时,默认的整个背景LAYOUT长宽与一个虚拟的scroller保持一致,当scroller移动坐标时
layout可以通过计算scroll移动的横向纵向坐标及距离来引发自己的scroll 这里就是通过computeScroll来计算的
然后父类自己调用computeScroll 函数scroller.getCurrX(),返回当前滚动X方向的偏移 因为他每动一下 就要是childview也跟着移动 改变他的scrollx和scrolly 这个主要是由于scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2); 这个引起的 他会引起childview坐标的变化,他的意图是告诉父view 我要滚动了 在一段时间中 从当前的位置滚动到指定的位置 并且是以scroller的动画进行变化移动。这样父类就告诉子类要改变坐标了 childView 坐标即将变化都要去调用computeScroll方法。
例外一种是不需要scroller 直接监听手势动作 滚动到那 那么就直接调用scrollBy 实时的将视图移动,改变着childView的scrollX与scrollY。子类坐标已将改变之前 就会调用computeScroll这个函数 因为scrollBy是移动一段距离 跟scroller.start都是将要触发 而scrollTo是正在触发 不会调用computeScroll方法 这是自己忽悠自己的 内部机制 我也不知道 但是自己能说的通 我就这么理解了
二 某某的理解
computeScroll:主要功能是计算拖动的位移量、更新背景、设置要显示的屏幕(setCurrentScreen(mCurrentScreen);)。
重写computeScroll()的原因
调用startScroll()是不会有滚动效果的,只有在computeScroll()获取滚动情况,做出滚动的响应
computeScroll在父控件执行drawChild时,会调用这个方法