1e41f4b71Sopenharmony_ci# Path2D 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci**\<Path2D>** allows you to describe a path through an existing path. This path can be drawn through the **stroke** API of **Canvas**. For details, see [Path2D](../reference/apis-arkui/arkui-js/js-components-canvas-path2d.md). 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## Drawing Line Segments 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ciCreate a **\<Path2D>** object and use line segments to create different shapes. 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci```html 12e41f4b71Sopenharmony_ci<!-- xxx.hml --> 13e41f4b71Sopenharmony_ci<div class="container"> 14e41f4b71Sopenharmony_ci <canvas ref="canvas"></canvas> 15e41f4b71Sopenharmony_ci</div> 16e41f4b71Sopenharmony_ci``` 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci```css 19e41f4b71Sopenharmony_ci/* xxx.css */ 20e41f4b71Sopenharmony_ci.container { 21e41f4b71Sopenharmony_ci flex-direction: column; 22e41f4b71Sopenharmony_ci background-color: #F1F3F5; 23e41f4b71Sopenharmony_ci align-items: center; 24e41f4b71Sopenharmony_ci justify-content: center; 25e41f4b71Sopenharmony_ci width: 100%; 26e41f4b71Sopenharmony_ci height: 100%; 27e41f4b71Sopenharmony_ci} 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_cicanvas { 30e41f4b71Sopenharmony_ci width: 600px; 31e41f4b71Sopenharmony_ci height: 600px; 32e41f4b71Sopenharmony_ci background-color: #fdfdfd; 33e41f4b71Sopenharmony_ci border: 5px solid red; 34e41f4b71Sopenharmony_ci} 35e41f4b71Sopenharmony_ci``` 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_ci```js 38e41f4b71Sopenharmony_ci// xxx.js 39e41f4b71Sopenharmony_ciimport promptAction from '@ohos.promptAction'; 40e41f4b71Sopenharmony_ci 41e41f4b71Sopenharmony_ciexport default { 42e41f4b71Sopenharmony_ci onShow() { 43e41f4b71Sopenharmony_ci let ctx = this.$refs.canvas.getContext('2d', { 44e41f4b71Sopenharmony_ci antialias: true 45e41f4b71Sopenharmony_ci }); 46e41f4b71Sopenharmony_ci let path = ctx.createPath2D(); 47e41f4b71Sopenharmony_ci // Roof 48e41f4b71Sopenharmony_ci path.moveTo(10, 300); 49e41f4b71Sopenharmony_ci path.lineTo(210, 100); 50e41f4b71Sopenharmony_ci path.lineTo(410, 300); 51e41f4b71Sopenharmony_ci // House 52e41f4b71Sopenharmony_ci path.moveTo(10, 300); 53e41f4b71Sopenharmony_ci path.lineTo(410, 300); 54e41f4b71Sopenharmony_ci path.lineTo(410, 600); 55e41f4b71Sopenharmony_ci path.lineTo(10, 600); 56e41f4b71Sopenharmony_ci path.closePath(); 57e41f4b71Sopenharmony_ci // Window 58e41f4b71Sopenharmony_ci path.moveTo(50, 450); 59e41f4b71Sopenharmony_ci path.bezierCurveTo(70, 350, 130, 350, 150, 450); 60e41f4b71Sopenharmony_ci path.closePath(); 61e41f4b71Sopenharmony_ci // Door 62e41f4b71Sopenharmony_ci path.moveTo(250, 450); 63e41f4b71Sopenharmony_ci path.rect(250, 450, 100, 600); 64e41f4b71Sopenharmony_ci path.closePath(); 65e41f4b71Sopenharmony_ci // Chimney 66e41f4b71Sopenharmony_ci path.moveTo(365, 250); 67e41f4b71Sopenharmony_ci path.ellipse(310, 215, 30, 130, 0, Math.PI * 0.04, Math.PI * 1.1, 1); 68e41f4b71Sopenharmony_ci // Tree 69e41f4b71Sopenharmony_ci path.moveTo(485, 450); 70e41f4b71Sopenharmony_ci path.quadraticCurveTo(510, 500, 485, 600); 71e41f4b71Sopenharmony_ci path.moveTo(550, 450); 72e41f4b71Sopenharmony_ci path.quadraticCurveTo(525, 500, 550, 600); 73e41f4b71Sopenharmony_ci path.moveTo(600, 535); 74e41f4b71Sopenharmony_ci path.arc(520, 450, 85, 0, 6); 75e41f4b71Sopenharmony_ci ctx.stroke(path); 76e41f4b71Sopenharmony_ci } 77e41f4b71Sopenharmony_ci} 78e41f4b71Sopenharmony_ci``` 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci 82e41f4b71Sopenharmony_ci 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ci## Drawing Graphs 85e41f4b71Sopenharmony_ci 86e41f4b71Sopenharmony_ciUse **createPath2D** to create a path object and draw only **path1** so that only **path1** is displayed on the canvas. Click the **\<text>** component to trigger the **addPath** method. The **path2** object is passed to **path1** as a parameter. After the **stroke** operation is performed on the **path1** object, **path1** and **path2** are displayed on the canvas. Click **Change** to change the value of **setTransform** to** setTransform(2, 0.1, 0.1, 2, 0,0)**. The graph is enlarged and tilted to the left. 87e41f4b71Sopenharmony_ci 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci```html 90e41f4b71Sopenharmony_ci<!-- xxx.hml --> 91e41f4b71Sopenharmony_ci<div class="container"> 92e41f4b71Sopenharmony_ci <canvas ref="canvas"></canvas> 93e41f4b71Sopenharmony_ci <div class="content"> 94e41f4b71Sopenharmony_ci <text onclick="addPath">{{ isAdd }}</text> 95e41f4b71Sopenharmony_ci <text onclick="setTransform">{{ textName }}</text> 96e41f4b71Sopenharmony_ci </div> 97e41f4b71Sopenharmony_ci</div> 98e41f4b71Sopenharmony_ci``` 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci 101e41f4b71Sopenharmony_ci```css 102e41f4b71Sopenharmony_ci/* xxx.css */ 103e41f4b71Sopenharmony_ci.container { 104e41f4b71Sopenharmony_ci flex-direction: column; 105e41f4b71Sopenharmony_ci background-color: #F1F3F5; 106e41f4b71Sopenharmony_ci align-items: center; 107e41f4b71Sopenharmony_ci justify-content: center; 108e41f4b71Sopenharmony_ci width: 100%; 109e41f4b71Sopenharmony_ci height: 100%; 110e41f4b71Sopenharmony_ci} 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_cicanvas { 113e41f4b71Sopenharmony_ci width: 600px; 114e41f4b71Sopenharmony_ci height: 600px; 115e41f4b71Sopenharmony_ci background-color: #fdfdfd; 116e41f4b71Sopenharmony_ci border: 5px solid red; 117e41f4b71Sopenharmony_ci} 118e41f4b71Sopenharmony_ci 119e41f4b71Sopenharmony_ci.content { 120e41f4b71Sopenharmony_ci width: 80%; 121e41f4b71Sopenharmony_ci margin-top: 50px; 122e41f4b71Sopenharmony_ci margin-bottom: 50px; 123e41f4b71Sopenharmony_ci display: flex; 124e41f4b71Sopenharmony_ci flex-wrap: wrap; 125e41f4b71Sopenharmony_ci justify-content: space-around; 126e41f4b71Sopenharmony_ci} 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_citext { 129e41f4b71Sopenharmony_ci width: 150px; 130e41f4b71Sopenharmony_ci height: 80px; 131e41f4b71Sopenharmony_ci color: white; 132e41f4b71Sopenharmony_ci border-radius: 20px; 133e41f4b71Sopenharmony_ci text-align: center; 134e41f4b71Sopenharmony_ci background-color: #6060e7; 135e41f4b71Sopenharmony_ci margin-bottom: 30px; 136e41f4b71Sopenharmony_ci} 137e41f4b71Sopenharmony_ci``` 138e41f4b71Sopenharmony_ci 139e41f4b71Sopenharmony_ci 140e41f4b71Sopenharmony_ci```js 141e41f4b71Sopenharmony_ci// xxx.js 142e41f4b71Sopenharmony_ciimport promptAction from '@ohos.promptAction'; 143e41f4b71Sopenharmony_ci 144e41f4b71Sopenharmony_ciexport default { 145e41f4b71Sopenharmony_ci data: { 146e41f4b71Sopenharmony_ci ctx: null, 147e41f4b71Sopenharmony_ci path1: null, 148e41f4b71Sopenharmony_ci path2: null, 149e41f4b71Sopenharmony_ci path3: null, 150e41f4b71Sopenharmony_ci isAdd: "addPath2", 151e41f4b71Sopenharmony_ci isChange: true, 152e41f4b71Sopenharmony_ci textName: 'change' 153e41f4b71Sopenharmony_ci }, 154e41f4b71Sopenharmony_ci onShow() { 155e41f4b71Sopenharmony_ci this.ctx = this.$refs.canvas.getContext('2d', { 156e41f4b71Sopenharmony_ci antialias: true 157e41f4b71Sopenharmony_ci }); 158e41f4b71Sopenharmony_ci this.path1 = this.ctx.createPath2D(); 159e41f4b71Sopenharmony_ci // Square 160e41f4b71Sopenharmony_ci this.path1.moveTo(200, 200); 161e41f4b71Sopenharmony_ci this.path1.lineTo(400, 200); 162e41f4b71Sopenharmony_ci this.path1.lineTo(400, 400); 163e41f4b71Sopenharmony_ci this.path1.lineTo(200, 400); 164e41f4b71Sopenharmony_ci this.path1.closePath(); 165e41f4b71Sopenharmony_ci this.path2 = this.ctx.createPath2D(); 166e41f4b71Sopenharmony_ci // Arc 167e41f4b71Sopenharmony_ci this.path2.arc(300, 300, 75, 0, 6.28); 168e41f4b71Sopenharmony_ci this.ctx.stroke(this.path1); 169e41f4b71Sopenharmony_ci }, 170e41f4b71Sopenharmony_ci addPath() { 171e41f4b71Sopenharmony_ci if (this.isAdd == "addPath2") { 172e41f4b71Sopenharmony_ci // Clear the content in the specified area on the canvas. 173e41f4b71Sopenharmony_ci this.ctx.clearRect(0, 0, 600, 600); 174e41f4b71Sopenharmony_ci this.ctx.beginPath(); 175e41f4b71Sopenharmony_ci // Add a path to the current path. 176e41f4b71Sopenharmony_ci this.path2.addPath(this.path1); 177e41f4b71Sopenharmony_ci this.ctx.stroke(this.path2); 178e41f4b71Sopenharmony_ci this.isAdd = "clearPath2"; 179e41f4b71Sopenharmony_ci } else { 180e41f4b71Sopenharmony_ci this.ctx.clearRect(0, 0, 600, 600); 181e41f4b71Sopenharmony_ci this.ctx.stroke(this.path1); 182e41f4b71Sopenharmony_ci this.isAdd = "addPath2"; 183e41f4b71Sopenharmony_ci } 184e41f4b71Sopenharmony_ci }, 185e41f4b71Sopenharmony_ci setTransform() { 186e41f4b71Sopenharmony_ci if (this.isChange) { 187e41f4b71Sopenharmony_ci this.ctx.clearRect(0, 0, 600, 600); 188e41f4b71Sopenharmony_ci this.path3 = this.ctx.createPath2D(); 189e41f4b71Sopenharmony_ci this.path3.arc(150, 150, 100, 0, 6.28); 190e41f4b71Sopenharmony_ci // Reset and create a new transformation matrix. 191e41f4b71Sopenharmony_ci this.path3.setTransform(2, 0.1, 0.1, 2, 0, 0); 192e41f4b71Sopenharmony_ci this.ctx.stroke(this.path3); 193e41f4b71Sopenharmony_ci this.isChange = !this.isChange; 194e41f4b71Sopenharmony_ci this.textName = "back" 195e41f4b71Sopenharmony_ci } else { 196e41f4b71Sopenharmony_ci this.ctx.clearRect(0, 0, 600, 600); 197e41f4b71Sopenharmony_ci this.path3.setTransform(0.5, -0.1, -0.1, 0.5, 0, 0); 198e41f4b71Sopenharmony_ci this.ctx.stroke(this.path3); 199e41f4b71Sopenharmony_ci this.isChange = !this.isChange; 200e41f4b71Sopenharmony_ci this.textName = "change"; 201e41f4b71Sopenharmony_ci } 202e41f4b71Sopenharmony_ci } 203e41f4b71Sopenharmony_ci} 204e41f4b71Sopenharmony_ci``` 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_ci 207