ScrollBarDrawable位于/frameworks/base/core/widget/中,是ListView用于画scrollBar的类。
垂直scrollBar调用流程:View.onDrawScrollBars()==>onDrawVerticalScrollBar() ==> ScrollBarDrawable.draw() ==> drawThumb();
drawThumb()的参数offset就是scrollBar的垂直偏移量,决定scrollBar的位置。注意在draw() 中计算完offset后,重新调整了一回offset和length,如下所示:
// avoid the tiny thumb 防止索引太小,看不见
int minLength = thickness * 2;
if (length < minLength) {
length = minLength;
}
// avoid the too-big thumb 防止索引过小,超过ListView的Size
if (offset + length > size) {
offset = size - length;
}
尤其是对length调整后,并未更新offset,导致drawThumb()中使用的length与draw()中计算offset时,使用的并非同一值,这会产生一个结果:
当ListView项目数过多时(多到length小于minLength),移动至最后若干个项目时,scrollBar过早到达底部,没有scrollBar应有的效果,而且数量越多,效果越显著。