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

鸿蒙中 Canvas画布的操作及状态处理(三)

一、画布操作

常见的画布操作

操作类型说明
裁剪限制绘图区域,只在指定区域进行绘制
矩阵变换平移、缩放、旋转等坐标变换
状态保存与恢复保存/恢复画布状态(画布矩阵)

提示:需要先进行画布操作,再进行后续绘制,只有这样画布操作才有效果。

二、裁剪操作

裁剪是图形处理中的常见操作,裁剪针对的是画布本身,可以用于限制绘图区域,只在指定的区域进行绘制。

支持的裁剪操作

操作说明
裁剪矩形裁剪一个矩形区域
裁剪圆角矩形裁剪一个圆角矩形区域
裁剪自定义路径裁剪一个自定义路径区域
裁剪一个区域裁剪一个指定区域

接口说明

接口描述
clipRect(rect, clipOp?, doAntiAlias?)用于裁剪一个矩形
clipRoundRect(roundRect, clipOp?, doAntiAlias?)用于裁剪一个圆角矩形
clipPath(path, clipOp?, doAntiAlias?)用于裁剪一个自定义路径
clipRegion(region, clipOp?)用于裁剪一个区域

clipRect参数说明

参数说明
rect要裁剪的矩形区域
clipOp裁剪方式:交集(INTERSECT)和差集(DIFFERENCE)
doAntiAlias是否需要抗锯齿处理(true启用,false不启用)

开发示例:裁剪矩形

// 创建画刷 let brush = new drawing.Brush(); // 设置颜色为蓝色 brush.setColor(0xFF, 0x00, 0x00, 0xFF); // 设置画刷填充效果 canvas.attachBrush(brush); // 创建矩形对象 let rect: common2D.Rect = { left: 200, top: 200, right: 600, bottom: 600 }; // 裁剪矩形区域 canvas.clipRect(rect); // 绘制圆形(只在裁剪区域内显示) canvas.drawCircle(300, 300, 300); // 去除填充效果 canvas.detachBrush();

三、矩阵变换操作

矩阵变换也是常见的画布操作,是一种坐标系的转换,用于进行图形的变化。

支持的矩阵变换

操作说明
平移平移画布一段距离
缩放画布缩放
旋转画布旋转一定的角度
倾斜变换画布倾斜变换(水平轴和垂直轴上的偏移)

接口说明

接口描述
translate(dx, dy)用于平移画布一段距离
scale(sx, sy)用于画布缩放
rotate(degrees, sx, sy)用于画布旋转,正数顺时针,负数逆时针
skew(sx, sy)用于画布倾斜变换

平移(translate)

参数dx(水平方向平移量,px)、dy(垂直方向平移量,px)

// 创建画刷 let brush = new drawing.Brush(); // 设置颜色为红色 brush.setColor(0xFF, 0xFF, 0x00, 0x00); // 设置画刷填充效果 canvas.attachBrush(brush); // 执行平移操作(向右向下各平移300px) canvas.translate(300, 300); // 绘制矩形 canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); // 去除填充效果 canvas.detachBrush();

3.5 旋转(rotate)

参数degrees(旋转角度,正数顺时针,负数逆时针)、sx(旋转中心x坐标)、sy(旋转中心y坐标)

// 创建画刷 let brush = new drawing.Brush(); // 设置颜色为红色 brush.setColor(0xFF, 0xFF, 0x00, 0x00); // 设置画刷填充效果 canvas.attachBrush(brush); // 顺时针旋转45度,旋转中心为(200, 200) canvas.rotate(45, 200, 200); // 绘制矩形 canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); // 去除填充效果 canvas.detachBrush();

3.6 缩放(scale)

参数sx(沿x轴的缩放因子)、sy(沿y轴的缩放因子)

// 创建画刷 let brush = new drawing.Brush(); // 设置颜色为红色 brush.setColor({ alpha: 0xFF, red: 0xFF, green: 0x00, blue: 0x00 }); // 设置画刷填充效果 canvas.attachBrush(brush); // 执行放大操作(x轴和y轴分别放大2倍) canvas.scale(2, 2); // 绘制矩形 canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); // 去除填充效果 canvas.detachBrush();

四、画布状态保存与恢复

  • 保存操作:用于保存当前画布的状态到栈顶

  • 恢复操作:用于恢复保存在栈顶的画布状态

  • 恢复操作一旦执行,保存和恢复操作中间一系列平移、缩放、裁剪等操作都会被清除

接口说明

接口描述
save()保存当前画布的状态(画布矩阵)到一个栈顶
restore()恢复保存在栈顶的画布状态(画布矩阵)
restoreToCount(count)恢复到指定数量的画布状态(画布矩阵)

开发示例

// 创建画笔 let pen = new drawing.Pen(); // 设置颜色为红色 pen.setColor({ alpha: 0xFF, red: 0xFF, green: 0x00, blue: 0x00 }); // 设置描边宽度为20px pen.setStrokeWidth(20); // 设置画笔描边效果 canvas.attachPen(pen); // 保存操作,当前是不存在放大等操作的,这个原始状态会被保存下来 canvas.save(); // x轴和y轴方向分别放大2倍 canvas.scale(2, 2); // 绘制圆形,因为执行过放大操作,所以此时绘制的是大圆 canvas.drawCircle(300, 300, 200); // 恢复操作,恢复到没有放大的原始状态 canvas.restore(); // 绘制圆形,因为已经恢复到没有放大的原始状态,所以此时绘制的是小圆 canvas.drawCircle(300, 300, 200); // 去除描边效果 canvas.detachPen();

规律:恢复操作会清除保存和恢复之间所有变换操作的影响。

五、规则

  1. 先操作后绘制:需要先进行画布操作,再进行后续绘制,才有效果

  2. 状态栈机制:save将状态压栈,restore将状态出栈

  3. 恢复会清除中间操作:restore后,save和restore之间的所有变换操作都会被清除

鸿蒙画布操作包括裁剪(clipRect等)、矩阵变换(translate/rotate/scale)和状态保存恢复(save/restore),必须遵循"先操作后绘制"的原则,状态保存恢复使用栈机制管理画布矩阵。

http://www.jsqmd.com/news/660059/

相关文章:

  • 抖音批量下载终极指南:3步搞定无水印视频与音频提取
  • 别再只会仿真了!手把手教你用74LS192修改555定时器抢答器的倒计时时间
  • OpenCode应用场景:AI编程助手如何帮你重构代码、调试bug
  • 终极指南:3个实战场景掌握AMD Ryzen SMU调试工具
  • Python 中的递归赋值总结
  • NVIDIA Profile Inspector完整指南:解锁200+显卡隐藏设置,免费提升游戏性能
  • LTSF-Linear参数调优技巧:10个关键设置让你的预测精度提升50%
  • SAM 3在电商场景的应用:快速分割商品主体,制作白底图so easy
  • 中文句子相似度判断神器:StructBERT本地部署保姆级教程
  • 抖音/B站/快手/小H书直播录制神器!原画超清无水印+自动监控+分段存储,主播开播秒抓取
  • SpringBoot+Vue二手闲置交易系统源码+论文
  • 2026年3月优质包装机定做厂家推荐,全自动三维包装机/透明膜三维包装机/枕式收缩包装机/封箱打包流水线,包装机品牌推荐 - 品牌推荐师
  • 别再死记硬背了!用Python脚本自动解析3GPP 27.007 AT指令(附源码)
  • 你的口袋渗透实验室:详解NetHunter Rootless在Termux下的工作原理与高级用法
  • 百川2-13B模型IDEA插件开发构思:智能代码审查提示
  • 飞书文档批量导出神器:3分钟搞定700+文档迁移,支持全平台运行
  • zteOnu技术解析:中兴光猫工厂模式解锁与Telnet永久开启实战指南
  • 终极指南:TMSpeech - Windows平台实时语音转文字的高效解决方案
  • 美团美点卡回收新行情出炉,回收价格怎么样? - 猎卡回收公众号
  • Python异步爬虫效率翻倍秘诀:从‘每个请求一个Session’到‘全局Session管理’的思维转变
  • 如何快速部署DeepBlueCLI:5分钟搭建企业级安全检测平台
  • dotfiles社区资源:如何从其他开发者那里获取灵感
  • 题解:洛谷 AT_abc417_d [ABC417D] Takahashi‘s Expectation
  • Chipmunk2D:快速入门2D物理引擎的终极指南
  • 如何构建安全可靠的 myDrive 用户认证系统:JWT访问令牌与刷新令牌完整指南
  • ESP32语音唤醒项目实战:手把手教你配置VADNet模型,搞定语音首字不丢
  • 深蓝词库转换:一站式解决跨平台输入法词库迁移难题
  • 3个高效方法解决TranslucentTB启动时Microsoft.UI.Xaml依赖缺失问题
  • ComfyUI-Manager终极指南:如何轻松管理你的AI绘画扩展节点库
  • 重新定义:KeymouseGo的架构哲学与技术决策树