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![en-us_image_0000001232002968](figures/en-us_image_0000001232002968.png)
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![en-us_image_0000001231683112](figures/en-us_image_0000001231683112.gif)
207