关于Android中View的Canvas的探讨

来源:互联网 发布:淘宝精选是怎么回事 编辑:程序博客网 时间:2024/06/13 23:28

近日在写自定义控件的时候发现通过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,使得绘制逻辑大大简化。

希望看到的朋友可以讨论看看我的理解是否正确,谢谢。



原创粉丝点击