1# 画布操作及状态处理(ArkTS) 2 3 4## 场景介绍 5 6创建或获取得到Canvas画布之后,可以基于画布进一步地进行图形操作和状态处理。画布操作属于可选操作,开发者可以根据场景需要进行。需要先进行画布操作,再进行后续绘制,只有这样画布操作才有效果。 7 8常见的画布操作如下: 9 10- 裁剪。 11 12- 矩阵变换,如平移、缩放、旋转等。 13 14- 状态保存与恢复。 15 16更多画布操作和具体接口参数使用,请见[drawing.Canvas](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#canvas)。 17 18 19## 裁剪操作 20 21裁剪是图形处理中的常见操作,裁剪针对的是画布本身,可以用于限制绘图区域,只在指定的区域内容进行绘制。需要先进行裁剪操作,再进行绘制,才会有对应效果。 22 23当前支持的裁剪操作主要如下: 24 25- 裁剪矩形。 26 27- 裁剪圆角矩形。 28 29- 裁剪自定义路径。 30 31- 裁剪一个区域。 32 33 34### 接口说明 35 36裁剪操作常用接口如下表所示,详细的使用和参数说明请见[drawing.Canvas](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#canvas)。 37 38 39| 接口 | 描述 | 40| -------- | -------- | 41| clipRect(rect: common2D.Rect, clipOp?: ClipOp, doAntiAlias?: boolean): void | 用于裁剪一个矩形。 | 42| clipRoundRect(roundRect: RoundRect, clipOp?: ClipOp, doAntiAlias?: boolean): void | 用于裁剪一个圆角矩形。 | 43| clipPath(path: Path, clipOp?: ClipOp, doAntiAlias?: boolean): void | 用于裁剪一个自定义路径。 | 44| clipRegion(region: Region, clipOp?: ClipOp): void | 用于裁剪一个区域。 | 45 46 47### 开发示例 48 49此处以在画布上裁剪矩形为例给出示例和效果图,其他裁剪操作的逻辑基本相同,注意调用对应的接口并确保要裁剪的数据类型对应准确即可,此处不再一一展开。具体详细的使用和参数说明请见[drawing.Canvas](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#canvas)。 50 51使用clipRect()接口裁剪矩形。有以下3个入参: 52 53 54- rect是要裁剪的矩形区域。 55 56- clipOp是裁剪方式,包括交集(INTERSECT)和差集(DIFFERENCE),具体可见[ClipOp](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#clipop12)。 57 58- doAntiAlias表示是否需要抗锯齿处理,如果为true则启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理,如果为false则不开启。 59 60 61```ts 62// 创建画刷 63let brush = new drawing.Brush(); 64// 设置颜色为蓝色 65brush.setColor(0xFF, 0x00, 0x00, 0xFF); 66// 设置画刷填充效果 67canvas.attachBrush(brush); 68// 创建矩形对象 69let rect: common2D.Rect = { left: 200, top: 200, right: 600, bottom: 600 }; 70// 裁剪矩形区域 71canvas.clipRect(rect); 72// 绘制圆形 73canvas.drawCircle(300, 300, 300); 74// 去除填充效果 75canvas.detachBrush(); 76``` 77 78 79| 原始图 | 裁剪后的图 | 80| -------- | -------- | 81|  |  | 82 83 84## 矩阵变化操作 85 86矩阵变换也是常见的画布操作,是一种坐标系的转换,用于进行图形的变化。 87 88当前支持的矩阵变换主要如下: 89 90- 平移 91 92- 缩放 93 94- 旋转 95 96 97### 接口说明 98 99矩阵变换操作常用接口如下表所示,详细的使用和参数说明请见[drawing.Canvas](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#canvas)。 100 101| 接口 | 描述 | 102| -------- | -------- | 103| translate(dx: number, dy: number): void | 用于平移画布一段距离。 | 104| scale(sx: number, sy: number): void | 用于画布缩放。 | 105| rotate(degrees: number, sx: number, sy: number): void | 用于画布旋转一定的角度,正数表示顺时针旋转,负数反之。 | 106| skew(sx: number, sy: number) : void | 用于画布倾斜变换,包括水平轴和垂直轴上的偏移。 | 107 108 109### 平移 110 111使用translate()接口实现画布平移。接口接受2个参数,分别为水平方向和垂直方向的平移量,单位为px。 112 113简单示例和示意图如下所示: 114 115 116```ts 117// 创建画刷 118let brush = new drawing.Brush(); 119// 设置颜色为红色 120brush.setColor(0xFF, 0xFF, 0x00, 0x00); 121// 设置画刷填充效果 122canvas.attachBrush(brush); 123// 执行平移操作 124canvas.translate(300, 300); 125// 绘制矩形 126canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); 127// 去除填充效果 128canvas.detachBrush(); 129``` 130 131 132| 原始图 | 平移后的效果图 | 133| -------- | -------- | 134|  |  | 135 136 137### 旋转 138 139使用rotate()接口实现画布旋转,接口接受3个参数,分别为:旋转角度、旋转中心的x坐标和y坐标。 140 141 142简单示例和示意图如下所示: 143 144 145```ts 146// 创建画刷 147let brush = new drawing.Brush(); 148// 设置颜色为红色 149brush.setColor(0xFF, 0xFF, 0x00, 0x00); 150// 设置画刷填充效果 151canvas.attachBrush(brush); 152// 顺时针旋转45度 153canvas.rotate(45, 200, 200); 154// 绘制矩形 155canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); 156// 去除填充效果 157canvas.detachBrush(); 158``` 159 160 161| 原始图 | 旋转后的效果图 | 162| -------- | -------- | 163|  |  | 164 165 166### 缩放 167 168使用scale()接口进行画布缩放,接口接受2个参数,分别为沿x轴和y轴的缩放因子。 169 170 171简单示例和示意图如下所示: 172 173 174```ts 175// 创建画刷 176let brush = new drawing.Brush(); 177// 设置颜色为红色 178brush.setColor({ alpha: 0xFF, red: 0xFF, green: 0x00, blue: 0x00 }); 179// 设置画刷填充效果 180canvas.attachBrush(brush); 181// 执行放大操作 182canvas.scale(2, 2); 183// 绘制矩形 184canvas.drawRect({ left: 200, top: 200, right: 600, bottom: 600 }); 185// 去除填充效果 186canvas.detachBrush(); 187``` 188 189 190| 原始图 | 缩放后的效果图 | 191| -------- | -------- | 192|  |  | 193 194 195## 画布状态保存与恢复 196 197 198保存操作用于保存当前画布的状态到一个栈顶,恢复操作用于恢复保存在栈顶的画布状态,恢复操作一旦执行,保存和恢复操作中间一系列平移、缩放、剪裁等操作都会被清除。 199 200 201### 接口说明 202 203画布状态保存与恢复使用的接口如下表所示,详细的使用和参数说明请见[canvas](../reference/apis-arkgraphics2d/js-apis-graphics-drawing.md#canvas)。 204 205| 接口 | 描述 | 206| -------- | -------- | 207| save(): void; | 用于保存当前画布的状态(画布矩阵)到一个栈顶。 | 208| restore(): void; | 用于恢复保存在栈顶的画布状态(画布矩阵)。 | 209| restoreToCount(count: number): void; | 用于恢复到指定数量的画布状态(画布矩阵)。 | 210 211简单示例和示意图如下所示: 212 213 214```ts 215// 创建画笔 216let pen = new drawing.Pen(); 217// 设置颜色为红色 218pen.setColor({ alpha: 0xFF, red: 0xFF, green: 0x00, blue: 0x00 }); 219// 设置描边宽度为20px 220pen.setStrokeWidth(20); 221// 设置画笔描边效果 222canvas.attachPen(pen); 223// 保存操作,当前是不存在放大等操作的,这个原始状态会被保存下来 224canvas.save(); 225// x轴和y轴放行分别放大2倍 226canvas.scale(2, 2); 227// 绘制圆形,因为执行过放大操作,所以此时绘制的是大圆 228canvas.drawCircle(300, 300, 200); 229// 恢复操作,恢复到没有放大的原始状态 230canvas.restore(); 231// 绘制圆形,因为已经恢复到没有放大的原始状态,所以此时绘制的是小圆 232canvas.drawCircle(300, 300, 200); 233// 去除描边效果 234canvas.detachPen(); 235``` 236 237 238 239 240<!--RP1--> 241## 相关实例 242 243针对Drawing(ArkTS)的开发,有以下相关实例可供参考: 244 245- [ArkTSGraphicsDraw (API14)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/DocsSample/Drawing/ArkTSGraphicsDraw) 246<!--RP1End-->