解决方案 »

  1.   

    看真没看明白你到底想问啥。canvas.translate(0, -yoff);
    看起来只是处理了一下滚动条,如果滚动条纵坐标滚过了yoff个像素,那可见区域就是从yoff开始,所以translate一下。
    和坐标转换什么的没啥关系吧。onMeasure只是告诉ViewGroup,你希望得到的大小,实际上View的大小是ViewGroup.onLayout里面,调用child.layout确定的,可以完全不管onMeasure指定的大小。mLeft, mTop, mRight, mBottom都是以ViewGroup为坐标系,(0, 0)代表左上。Framebuffer我没研究过,不过我感觉在android的View的层面,应该不需要关心Framebuffer是怎么显示的。
      

  2.   

    onLayout只会计算View的位置,而不会计算大小,即onLayout里面计算mLeft,mTop,然后根据onMeasure计算的mMeasureWidth,mMeasureHeight来计算mRight,mBottom,具体就是mRight = mLeft + mMeasureWidth,mBottom=mTop+mMeasureHeight,这样确定View的显示区域和位置吧
      

  3.   

    onLayout只会计算View的位置,而不会计算大小,即onLayout里面计算mLeft,mTop,然后根据onMeasure计算的mMeasureWidth,mMeasureHeight来计算mRight,mBottom,具体就是mRight = mLeft + mMeasureWidth,mBottom=mTop+mMeasureHeight,这样确定View的显示区域和位置吧原则上是这样的,但不是强制要求的,
    通常来说子View需要在onMeasure里面调用setMeasuredDimension。然后ViewGroup在布局的时候会调用子View的getMeasuredWidth/Height方法,来获取子View“希望”获得的大小。
    ViewGroup在onLayout的时候,会通过调用子View的layout方法,来设定View的实际大小,“通常”是和子View的getMeasuredWidth/Height是一致的。
    所以View.getWidth的结果其实是mRight - mLeft。而View.getMeasuredWidth的结果才是通过onMeasure计算获取的结果。不过这和你的问题貌似没啥关系吧。