近日在写自定义控件的时候发现通过addView方式添加到viewGroup的内容在重写onDraw的时候没有发生变化,考虑可能是图层不同。
此处通过
LayoutInflater.from(context).inflate加载XML生成控件
通过setWillNotDraw(false);使得onDraw有效
重写的onDraw方法
这里插入新的背景后之前的内容依然存在而且是在上层
最终真机效果如下
查看源码没有说明关于canvas的具体内容只知道 点击打开链接
对于视图层次树中的View,通过 Measure 和 layout 两个过程之后,便可确定其大小和位置,视图在绘制的过程中,根据其mLeft, mRight, mTop, mButtom, mScrollX和mScrollY等参数,将父节点传过来的Canvas进行剪切操作,得到新的Canvas,该剪切区便是父节点分配给子节点的视图区域,其源代码如下:
if ((flags & ViewGroup.FLAG_CLIP_CHILDREN) == ViewGroup.FLAG_CLIP_CHILDREN &&
!useDisplayListProperties && cache == null) {
if (offsetForScroll) {
canvas.clipRect(sx, sy, sx + (mRight - mLeft), sy + (mBottom - mTop));
} else {
if (!scalingRequired || cache == null) {
canvas.clipRect(0, 0, mRight - mLeft, mBottom - mTop);
} else {
canvas.clipRect(0, 0, cache.getWidth(), cache.getHeight());
}
}
}
Canvas之所以要这么设计的主要原因是,为了View的绘制,通过这种方式,使得View每次绘制是,都可以该视图的原点坐标作为绘制的原点坐标,而独立于其他View,使得绘制逻辑大大简化。
希望看到的朋友可以讨论看看我的理解是否正确,谢谢。