想当然时在draw(canvas)的时候对canvas进行了translate结果仍是没有找到。
然后查看了4.0的时候的View的源码,在第一步drawBackground的时候看见了.
if (!dirtyOpaque) {
final Drawable background = mBGDrawable;
if (background != null) {
final int scrollX = mScrollX;
final int scrollY = mScrollY;
if (mBackgroundSizeChanged) {
background.setBounds(0, 0, mRight - mLeft, mBottom - mTop);
mBackgroundSizeChanged = false;
}
if ((scrollX | scrollY) == 0) {
background.draw(canvas);
} else {
canvas.translate(scrollX, scrollY);
background.draw(canvas);
canvas.translate(-scrollX, -scrollY);
}
}
}
然后就回到api26进View#drawBackground(canvas)中找,果然找到了。
//...省略
final int scrollX = mScrollX;
final int scrollY = mScrollY;
if ((scrollX | scrollY) == 0) {
background.draw(canvas);
} else {
canvas.translate(scrollX, scrollY);
background.draw(canvas);
canvas.translate(-scrollX, -scrollY);
}
可以很清楚的看到,在绘制背景的时候先对canvas进行了translate然后绘制完成后重新translate回来,就是这么简单。。。