前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )

【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )

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

文章目录

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

其中 图层栈 又称为 Layer 栈 ;

一、Canvas 状态栈入栈与出栈


状态栈 用于保存 绘图坐标系 信息 ,

  • 每次调用 Canvas#save() 方法 , 都会向 状态栈 中存储一份坐标数据 , 即 入栈操作 , 状态栈 是 后入先出 的栈结构 数据 ;
  • 每次调用 Canvas#restore() 方法 , 就是将 状态栈 栈顶的坐标数据 , 进行 出栈操作 ;

Canvas#save() 方法函数原型 :

代码语言:javascript
复制
    /**
     * 保存当前矩阵并将其剪辑到私有堆栈上。
     * 
     * 随后对translate、scale、rotate、skew、concat或clipRect、clipPath的调用都将照常运行,
     * 但当对restore()进行平衡调用时,这些调用将被忘记,并且将恢复save()之前存在的设置。
     *
     * @return 传递给restoreToCount()以平衡此save()的值
     */
    public int save() {
        return nSave(mNativeCanvasWrapper, MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG);
    }

Canvas#restore() 方法函数原型 :

代码语言:javascript
复制
    /**
     * 此调用平衡了之前对save()的调用,并用于删除自上次save调用以来对矩阵/片段状态的所有修改。
     * 调用restore()的次数比调用save()的次数多是错误的。
     */
    public void restore() {
        if (!nRestore(mNativeCanvasWrapper)
                && (!sCompatibilityRestore || !isHardwareAccelerated())) {
            throw new IllegalStateException("Underflow in restore - more restores than saves");
        }
    }

二、获取 Canvas 状态栈容量


通过调用 Canvas#getSaveCount() 方法 , 可以 获取当前 Canvas 画布的 状态栈 容量 , 当前缓存了多少个 坐标数据 , 也就是调用了多少次 Canvas#save() 方法 ;

Canvas#getSaveCount() 函数原型 :

代码语言:javascript
复制
    /**
     * 返回画布私有堆栈上的矩阵/剪辑状态数。
     * 这将等于#save()调用-#restore()调用。
     */
    public int getSaveCount() {
        return nGetSaveCount(mNativeCanvasWrapper);
    }

三、Canvas 状态栈原点数据


Canvas 的 状态栈 中, 默认存在一个数据 , 就是 原点 坐标数据 , 也就是即使不调用 Canvas#save() 方法 , 直接调用 Canvas#getSaveCount() 方法获取的值是 1 ;

如果没有调用 Canvas#save() 方法 , 直接调用 Canvas#restore() 方法 , 就会将 状态栈 中的 原点坐标数据 出栈 , 该操作会导致程序崩溃 , 崩溃信息如下 :

代码语言:javascript
复制
2022-07-05 18:08:53.073 22010-22010/kim.hsl.android_ui E/AndroidRuntime: FATAL EXCEPTION: main
    Process: kim.hsl.android_ui, PID: 22010
    java.lang.IllegalStateException: Underflow in restore - more restores than saves
        at android.graphics.Canvas.restore(Canvas.java:605)
        at kim.hsl.android_ui.PathMeasureView3.onDraw(PathMeasureView3.java:38)
        at android.view.View.draw(View.java:20207)
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Canvas 状态栈入栈与出栈
  • 二、获取 Canvas 状态栈容量
  • 三、Canvas 状态栈原点数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档