前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android UI】Canvas 画布 ⑦ ( Canvas 绘制显示区域 | Canvas 绘制矩形源码分析 )

【Android UI】Canvas 画布 ⑦ ( Canvas 绘制显示区域 | Canvas 绘制矩形源码分析 )

作者头像
韩曙亮
发布2023-03-30 16:06:03
1.5K0
发布2023-03-30 16:06:03
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;

其中 图层栈 又称为 Layer 栈 ;

Canvas 画布中 , 有 2 套坐标系 , 分别是 :

  • Canvas 自身坐标系
  • Canvas 绘图坐标系

一、Canvas 绘制显示区域


Canvas 绘制时 , 并不是由 Canvas 进行绘制 , 具体 执行绘制的硬件是 GPU ; 绘制的位置依赖于 Canvas 的两个坐标系 , 自身坐标系 与 绘图坐标系 ;

Canvas 中绘制图像的 具体位置 是坐标系 中的位置坐标 , 坐标分为以下两种 :

Canvas 自身坐标系 是 状态栈 中 最外层的坐标系 , 组件一旦创建成功 , 该坐标系是不会改变的 ; Canvas 自身坐标系是在 绘制流程中 ViewRootImpl#draw 方法中确定的 , 是无法改变的 ; 参考 【Android UI】Canvas 画布 ⑥ ( Canvas 绘图源码分析 | ViewRootImpl#draw 方法源码 | ViewRootImpl#drawSoftware 方法源码 ) 博客 ;

Canvas 绘图坐标系 是 当前要绘制的图像 所在的 坐标系 , 该 绘图坐标系 表示具体绘制的元素要画到哪个位置 , 该 绘图坐标系 是通过对 Canvas 自身坐标系 进行若干次的 平移 , 旋转 , 缩放 得来的 ;

调用 Canvas#translate , Canvas#rotate , Canvas#scale 方法 , 可以改变 Canvas 的绘图坐标系 ;

Canvas 自身坐标系 有一个很重要的作用 就是 确定画布范围 , 之后所有的绘制内容只能显示这个画布范围内的元素 , 画出边界的元素是不显示的 ;

如下图 , 蓝色矩形框是 Canvas 自身坐标系 , 红色矩形框是 Canvas 绘图坐标系 , 两个坐标系重合部分 绿色矩形框 就是显示的部分 , 红色矩形框范围绘制的内容不显示在界面中 ;

二、Canvas 绘制矩形源码分析


调用 Canvas#drawRect 方法绘制矩形 , 调用的函数原型如下 :

代码语言:javascript
复制
    /**
     * 使用指定的绘制绘制指定的矩形。矩形将根据绘画中的样式填充或边框。
     *
     * @param rect 要绘制的矩形
     * @param paint 绘制矩形的画笔
     */
    public void drawRect(@NonNull RectF rect, @NonNull Paint paint) {
        super.drawRect(rect, paint);
    }

在上述函数中 , 调用了父类的 BaseCanvas#drawRect 方法 ,

代码语言:javascript
复制
    public void drawRect(@NonNull RectF rect, @NonNull Paint paint) {
        throwIfHasHwBitmapInSwMode(paint);
        nDrawRect(mNativeCanvasWrapper,
                rect.left, rect.top, rect.right, rect.bottom, paint.getNativeInstance());
    }

在上述函数中 , 调用了 native 方法 BaseCanvas#nDrawRect , 该方法用于调用 GPU 进行绘图 ;

代码语言:javascript
复制
    private static native void nDrawRect(long nativeCanvas, float left, float top, float right,
            float bottom, long nativePaint);

绘制矩形时 , 将 Rect 拆分成了 左上右下 四个数据 , float left, float top, float right, float bottom , 这是绘图坐标系中的数据 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Canvas 绘制显示区域
  • 二、Canvas 绘制矩形源码分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档