Canvas 源码

本文探讨了Android开发中的自定义控件绘制,重点解析了Canvas的源码。Canvas作为绘制的基础,涉及bitmap、canvas、绘图材料和画笔四个关键组件。文章介绍了Canvas的构造方法,包括无参构造和基于bitmap的构造,以及如何设置和获取canvas的密度和viewport。此外,还讨论了剪辑边界、保存和恢复状态的功能,为Android图形绘制提供了深入的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看自定义控件---绘制view

今天先上点Canvas的源码,持续更新中。。。

下面是一点Canvas源码

/**
 * The Canvas class holds the "draw" calls. To draw something, you need
 * 4 basic components: A Bitmap to hold the pixels, a Canvas to host
 * the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect,
 * Path, text, Bitmap), and a paint (to describe the colors and styles for the
 * drawing).
 *
 * <div class="special reference">
 * <h3>Developer Guides</h3>
 * <p>For more information about how to use Canvas, read the
 * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">
 * Canvas and Drawables</a> developer guide.</p></div>
 */
public class Canvas {
    /** @hide */
    public static boolean sCompatibilityRestore = false;

    /**
     * Should only be assigned in constructors (or setBitmap if software canvas),
     * freed in finalizer.
     * @hide
     */
    protected long mNativeCanvasWrapper;
 /**
     * Construct an empty raster canvas. Use setBitmap() to specify a bitmap to
     * draw into.  The initial target density is {@link Bitmap#DENSITY_NONE};
     * this will typically be replaced when a target bitmap is set for the
     * canvas.
     */
    public Canvas() {
        if (!isHardwareAccelerated()) {
            // 0 means no native bitmap
            mNativeCanvasWrapper = initRaster(null);
            mFinalizer = new CanvasFinalizer(mNativeCanvasWrapper);
        } else {
            mFinalizer = null;
        }
    }



Canvas 类保存了draw 的调用,你需要四个基本的组件来绘制。1.bitmap保存像素的位图。2.canvas保存draw的调用。3一个原始绘画材料,4.一个画笔(color,style)

有两个构造方法,一个无参

### Unity Canvas 源码分析 #### Canvas 类的核心功能 `Canvas` 是 Unity UI 系统中的核心组件之一,负责管理所有的 UI 元素。每个 `Canvas` 组件都关联着一个渲染器,用于决定如何以及在哪里绘制其子对象[^1]。 ```csharp public class Canvas : Behaviour, ICanvasRaycastFilter { public enum RenderMode { ScreenSpaceOverlay, ScreenSpaceCamera, WorldSpace } private Camera m_Camera; private RectTransform m_RectTransform; // ...其他成员变量和方法... } ``` #### 渲染模式解析 `Canvas` 支持三种不同的渲染模式: - **Screen Space - Overlay**: 所有UI元素直接覆盖在屏幕上,不受到任何摄像机的影响。 - **Screen Space - Camera**: UI元素相对于指定的摄像机位置显示,在屏幕空间内渲染但可以跟随摄像机移动。 - **World Space**: 将UI放置于世界坐标系中,如同普通的三维物体一样处理[^2]。 每种模式决定了最终图像的位置计算方式及其与场景其它部分的关系。 #### 更新过程 当游戏运行时,`Canvas` 的更新流程主要包括两个阶段:布局(Layout) 和 图形(Graphic)[^3]。 1. 布局阶段会遍历所有子节点并调整它们的位置大小; 2. 图形阶段则准备实际要绘制的内容,并提交给渲染管线。 此过程中涉及到多个内部类如 `Graphic`, `LayoutRebuilder` 来协助完成具体工作。 #### 性能优化建议 为了提高性能表现,开发者应当注意以下几点: - 合理设置 `Render Mode` 及相关参数以适应不同需求; - 使用合适的遮挡剔除策略来减少过量绘图调用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值