当前位置: 首页 > news >正文

Canvas 状态管理 语法糖 canvas.withSave() {}

1、Canvas 状态管理

canvas.withSave() 是一个扩展函数,它内部会调用 canvas.save() 和 canvas.restore(),确保 Canvas 状态在闭包结束后自动恢复。

2. 避免状态泄漏

如果不使用 withSave(),手动调用 save() 和 restore() 容易出错:

  • 忘记调用 restore() 会导致 Canvas 状态混乱
  • 多次调用 save() 而不对应 restore() 会耗尽 Canvas 状态栈

3. 代码安全性

// 错误的方式 - 容易忘记 restore()canvas.save()// ... 绘制代码 ...// 如果这里抛出异常,restore() 永远不会被调用// 正确的方式 - 自动管理状态canvas.withSave() {// ... 绘制代码 ...// 即使抛出异常,状态也会自动恢复}

4. 作用域清晰

withSave() 闭包明确界定了需要特殊 Canvas 状态的代码范围:

  • 闭包内的代码使用变换后的 Canvas
  • 闭包外的代码使用原始 Canvas

5. 变换的局部性

在这个例子中:

canvas.withSave() {translate(offsetX, offsetY)        // 平移scale(scaleFactor, scaleFactor, cx, cy)  // 缩放// 绘制矩形 - 使用变换后的坐标系for (rect in rects) {drawRect(...)}} // 自动恢复原始状态// 这里绘制子视图 - 使用原始坐标系super.dispatchDraw(canvas)

6. 为什么需要变换

  • 平移 (translate):移动整个画布,实现视图的拖拽效果
  • 缩放 (scale):以中心点为基准缩放,实现缩放效果
  • 矩形绘制:在变换后的坐标系中绘制,这样矩形就会跟随视图的变换

7. 为什么子视图绘制在闭包外

super.dispatchDraw(canvas) 需要在原始坐标系中执行,因为:

  • 子视图的布局已经考虑了变换
  • 子视图有自己的绘制逻辑
  • 避免双重变换导致的问题

这种设计确保了:

  • 矩形绘制使用变换后的坐标系
  • 子视图绘制使用原始坐标系
  • Canvas 状态自动管理,避免错误
http://www.dtcms.com/a/273269.html

相关文章:

  • AtCoder Beginner Contest 413
  • 并发编程原理与实战(十六)深入锁的演进,为什么有了synchronized还需要Lock?
  • UECC-UE连接协调的运作方式
  • (一)OpenCV——噪声去除(降噪)
  • React--Fiber 架构
  • 数据库操作核心知识点整理
  • mac m1芯片 安装pd及win10系统
  • 第12讲—一元函数积分学的物理应用
  • 在vscode中安装jupyter
  • 电机电角度与机械角度的个人理解:从蒙圈到理解到放弃
  • 蓝桥云课 矩形切割-Java
  • 快速分页wpf
  • npx cowsay 让动物说话~
  • Java重试+事务的方式优化saveBatch,配置信息修改
  • Flink Exactly Once 和 幂等
  • 【郑大二年级信安小学期】Day9:XSS跨站攻击XSS绕过CSRF漏洞SSRF漏洞
  • 服务器深夜告警?可能是攻击前兆!
  • Unity插件——ABC详解
  • AI驱动的低代码革命:解构与重塑开发范式
  • LeetCode 8. 字符串转换整数 (atoi)
  • 【保姆级喂饭教程】idea中安装Conventional Commit插件
  • FreeRTOS—任务创建和删除的API函数和方法
  • 书生实训营第二关:大模型对战
  • 列表初始化
  • C++ Lambda 表达式详解
  • 《棒垒球知道》奥运会的吉祥物是什么·棒球1号位
  • 【c++八股文】Day6:using和typedef
  • [yolo-world]YOLO-World数据集介绍及标注格式详解
  • SoC程序如何使用单例模式运行
  • 什么是 MIT License?核心要点解析