在Android的UI系统中,每个View都有一个ScrollabilityCache的单例对象。该对象定义在View.java中,用于保存ScrollBar的相关实例和属性(ScrollBar实际上是一个ScrollBarDrawable对象),并且实现了淡入淡出动画效果的线程代码。这些会在该View的所有ScrollBar中共用。
以垂直滚动条为例,画出滚动条的过程大致是:
1. View::Draw2. View::onDrawScrollBarsscrollBar.setParameters(computeVerticalScrollRange(),computeVerticalScrollOffset(),computeVerticalScrollExtent(), true);3. View::onDrawVerticalScrollBarscrollBar.draw4. ScrollBarDrawable::drawRect r = getBounds();if (drawTrack) {drawTrack(canvas, r, vertical);}if (drawThumb) {int size = vertical ? r.height() : r.width();int thickness = vertical ? r.width() : r.height();int length = Math.round((float) size * extent / range);int offset = Math.round((float) (size - length) * mOffset / (range - extent));// avoid the tiny thumbint minLength = thickness * 2;if (length < minLength) {length = minLength;}// avoid the too-big thumbif (offset + length > size) {offset = size - length;}drawThumb(canvas, r, offset, length, vertical);}