mScrollX 在draw时的处理

206 阅读1分钟

想当然时在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);
        }
    }
}

然后就回到api26View#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回来,就是这么简单。。。