文章目录

  • 一、Canvas 状态栈入栈与出栈
  • 二、获取 Canvas 状态栈容量
  • 三、Canvas 状态栈原点数据

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

其中 图层栈 又称为 Layer 栈 ;

一、Canvas 状态栈入栈与出栈


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

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

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

    /*** 保存当前矩阵并将其剪辑到私有堆栈上。* * 随后对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() 方法函数原型 :

    /*** 此调用平衡了之前对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() 函数原型 :

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

三、Canvas 状态栈原点数据


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

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

2022-07-05 18:08:53.073 22010-22010/kim.hsl.android_ui E/AndroidRuntime: FATAL EXCEPTION: mainProcess: kim.hsl.android_ui, PID: 22010java.lang.IllegalStateException: Underflow in restore - more restores than savesat 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)

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

  1. php画布怎么清除,JavaScript_JavaScript html5 canvas画布中删除一个块区域的方法,本文实例讲述了html5 canvas画布 - phpStudy...

    JavaScript html5 canvas画布中删除一个块区域的方法 本文实例讲述了html5 canvas画布中删除一个块区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 附:图 ...

  2. canvas画布会黑屏吗_Android SurfaceView 黑屏问题

    说一个真实的案例.其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类.所以我就用了. android:layout_width="match_parent&q ...

  3. 前端|利用canvas画布制作地球轨道

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 一.什么是<canvas> <canvas& ...

  4. html5选择状态,HTML5 Canvas 状态

    HTML5 Canvas 状态 我们在canvas上绘制图形的时候,经常需要通过save()和restore()改变2D上下文的状态.举例来说,你在绘制直线或矩形的时候需要一种strokStyle,在 ...

  5. Android UI框架集结

    Android UI框架集结 通过这些框架,感觉自己菜出了底线- Android Studio Android Studio可将导入jar包变成简单的一行代码: 在app/build.gradle文件 ...

  6. 【Android UI】Canvas 画布 ③ ( Canvas 图层栈 | Canvas#saveLayer() 新建图层 | Canvas 状态栈保存信息标志位 )

    文章目录 一.Canvas#saveLayer() 新建图层 二.Canvas 状态栈保存信息标志位 Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ; 其中 图层 ...

  7. 【Android UI】Canvas 画布 ⑨ ( Canvas 绘图坐标系平移实例 )

    文章目录 一.Canvas 绘图坐标系平移实例 二.代码示例 Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ; 其中 图层栈 又称为 Layer 栈 ; Canv ...

  8. s时钟画布 android,Android UI编程进阶——使用SurfaceViewt和Canvas实现动态时钟

    概述: 很多时候我们想要自己写一些类似时钟.罗盘的控件,却又找不到合适的Demo.我想这时你可能索性就直接上图片了.在Android有Canvas和Paint这么好的画师的情况下,还是选择使用图片,的 ...

  9. Android UI编程进阶——使用SurfaceViewt和Canvas实现动态时钟

    概述: 很多时候我们想要自己写一些类似时钟.罗盘的控件,却又找不到合适的Demo.我想这时你可能索性就直接上图片了.在Android有Canvas和Paint这么好的画师的情况下,还是选择使用图片,的 ...

最新文章

  1. idea 高效找出全部未被使用的代码
  2. 禁止直接在浏览器输入网址访问的代码
  3. 仿微信公众平台“打标签”功能~~~
  4. STM32 BOOT0连接不当造成死机
  5. Java虚拟机5:常用JVM命令参数
  6. Asp.net动态加载控件的一些问题
  7. php数组10000分割1000_PHP切割整数工具类似微信红包金额分配的思路详解
  8. 服务器 linux mysql5.7修改密码,navicat远程登录不了
  9. SHELL脚本“syntax error: unexpected end of file”解决方案[半原创]
  10. Android--存储权限
  11. 导出excel文件对空值用“--“占位处理
  12. [自定义控件]android自定义view实战之太极图
  13. java 线程 中断标志位
  14. pytorch BatchNorm参数详解,计算过程
  15. 位运算符:按位取反(~)、位与()、位或(|)、位异或(^);左移运算符(<<)、右移运算符(>>)
  16. AI智能检测服务器,AI智能分析预警系统主机
  17. C++设计模式(8)——命令模式
  18. mysql能放在电脑哪个盘_电脑文件一般放在哪个盘好呢?
  19. 设计误区之一-正无穷
  20. 谈谈对于企业级系统架构的理解—李平

热门文章

  1. 竹杖芒鞋轻胜马,一蓑烟雨任平生——写在38岁生日
  2. 基于Xlinx的时序分析、约束和收敛(2)----基础概念(上)
  3. 工业以太网交换机在高速公路隧道监控系统
  4. 使用Quartus II9.0实现用74161计数器设计一个12进制的计数器
  5. 电阻、电容、电感在电路中的作用及大致选择的条件
  6. 从硬件负利到硬件免费,乐视用生态化反深度改造传统硬件行业
  7. IPV6前缀变化设置通过防火墙的方法
  8. 计算机室维修报告,电脑维修-计算机组装和维护的实习报告
  9. 使用Java导入excel时警告:A part name shall not have a forward slash as the last character
  10. python 调用adb打开app