1# chart开发指导 2 3 4chart为图表组件,用于呈现线形图、柱状图和量规图界面。具体用法请参考[chart](../reference/apis-arkui/arkui-js/js-components-basic-chart.md)。 5 6 7## 创建chart组件 8 9在pages/index目录下的hml文件中创建一个chart组件。 10 11```html 12<!-- xxx.hml --> 13<div class="container"> 14 <chart class="chart-data" type="line" options="{{lineOps}}" datasets="{{lineData}}"></chart> 15</div> 16``` 17 18```css 19/* xxx.css */ 20.container { 21 width: 100%; 22 height: 100%; 23 flex-direction: column; 24 justify-content: center; 25 align-items: center; 26 background-color: #F1F3F5; 27} 28.chart-data { 29 width: 700px; 30 height: 600px; 31} 32``` 33 34```js 35// xxx.js 36export default { 37 data: { 38 lineData: [ 39 { 40 data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716] 41 } 42 ], 43 lineOps: { 44 xAxis: { 45 min: 0, 46 max: 20, 47 display: false, 48 }, 49 yAxis: { 50 min: 0, 51 max: 1000, 52 display: false, 53 }, 54 series: { 55 lineStyle: { 56 width: 15, 57 }, 58 } 59 }, 60 } 61} 62``` 63 64 65 66 67 68## 设置图表类型 69 70chart组件通过设置type属性定义图表类型,如将图表设置为柱状图。 71 72 73```html 74<!-- xxx.hml --> 75<div class="container"> 76 <div class="container"> 77 <div class="switch-block"> 78 <text class="title"> 79 {{ title }} 80 </text> 81 </div> 82 <tabs class="tabs" index="0" vertical="false" onchange="changes"> 83 <tab-content class="tabcontent" scrollable="true"> 84 <tabs > 85 <tab-bar class="tab-bar" mode="fixed"style="margin-bottom: 50px;"> 86 <text class="tab-text">线形图</text> 87 <text class="tab-text">柱状图</text> 88 <text class="tab-text">量规图</text> 89 </tab-bar> 90 <tab-content> 91 <div class="bar-block" style="margin-left: 30px;"> 92 <chart class="chart-data" type="line" ref="linechart" options="{{ lineOps }}" datasets="{{ lineData }}"> 93 </chart> 94 </div> 95 <div class="bar-block"> 96 <chart class="data-bar" type="bar" id="bar-chart" options="{{ barOps }}" datasets="{{ barData }}"> 97 </chart> 98 </div> 99 <div class="chart-block"> 100 <chart type="gauge" ></chart> 101 </div> 102 </tab-content> 103 </tabs> 104 </tab-content> 105 </tabs> 106 </div> 107</div> 108``` 109 110 111```css 112/* xxx.css */ 113.container { 114 width: 100%; 115 height: 100%; 116 flex-direction: column; 117 justify-content: center; 118 background-color: #F1F3F5; 119} 120.tab-bar{ 121 background-color: #F1F3F5; 122} 123.chart-data { 124 width: 700px; 125 height: 600px; 126} 127.title{ 128 margin-left: 50px; 129 margin-top: 50px; 130 font-size: 50px; 131} 132.line-block{ 133 align-items: center; 134 justify-content: center; 135} 136.bar-block{ 137 align-items: center; 138 justify-content: center; 139} 140.chart-block{ 141 width: 90%; 142 margin-left: 30px; 143} 144``` 145 146 147```js 148// xxx.js 149export default { 150 data: { 151 title: "类型展示", 152 barData: [ 153 { 154 fillColor: '#3848e8', 155 data: [763, 550, 551, 554, 731, 654, 525, 696, 595], 156 } 157 ], 158 lineData: [ 159 { 160 strokeColor: '#0081ff', 161 fillColor: '#cce5ff', 162 data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], 163 gradient: true, 164 } 165 ], 166 lineOps: { 167 xAxis: { 168 min: 0, 169 max: 20, 170 display: false, 171 }, 172 yAxis: { 173 min: 0, 174 max: 1000, 175 display: false, 176 }, 177 series:{ 178 lineStyle: { 179 width: "5px", 180 smooth: true, 181 }, 182 headPoint: { 183 shape:"circle", 184 size: 20, 185 strokeWidth: 5, 186 fillColor: '#ffffff', 187 strokeColor: '#007aff', 188 display: true, 189 }, 190 loop:{ 191 margin: 2, 192 gradient: true 193 } 194 }, 195 }, 196 barOps: { 197 xAxis: { 198 min: 0, 199 max: 20, 200 display: false, 201 axisTick: 10, 202 }, 203 yAxis: { 204 min: 0, 205 max: 1000, 206 }, 207 }, 208 }, 209} 210``` 211 212 213 214> **说明:** 215> 216> chart不支持显示每个点的值。 217 218 219## 设置图表属性 220 221chart组件在options属性中设置对x轴、y轴和数据序列参数的设置,在datasets属性里添加对线条颜色、填充颜色、填充渐变颜色和绘制点集的设置。 222 223 224```html 225<!-- xxx.hml --> 226<div class="container"> 227 <chart class="chart-data" type="line" options="{{lineOps}}" datasets="{{lineData}}"></chart> 228</div> 229``` 230 231 232```css 233/* xxx.css */ 234.container { 235 width: 100%; 236 height: 100%; 237 flex-direction: column; 238 justify-content: center; 239 align-items: center; 240 background-color: #F1F3F5; 241} 242.chart-data { 243 width: 700px; 244 height: 600px; 245} 246``` 247 248 249```js 250// xxx.js 251export default { 252 data: { 253 //线形图数据 254 lineData: [ 255 { 256 strokeColor: '#0081ff', 257 fillColor: '#cce5ff', //填充色 258 data: [463, 250, 251, 254, 431, 354, 225, 396, 295, 328, 491, 205, 313, 275, 475, 553, 491, 380, 357, 416], 259 gradient: true, 260 } 261 ], 262 lineOps: { 263 //x轴参数设置 264 xAxis: { 265 min: 0, 266 max: 20, 267 display: false, 268 }, 269 //y轴参数设置 270 yAxis: { 271 min: 0, 272 max: 1000, 273 display: false, 274 }, 275 //数据序列参数设置 276 series: { 277 //线样式设置 278 lineStyle: { 279 width: "5px", 280 smooth: true, 281 }, 282 //线最前端位置白点的样式和大小 283 headPoint: { 284 shape: "circle", 285 size: 20, 286 strokeWidth: 5, 287 fillColor: '#ffffff', 288 strokeColor: '#007aff', 289 display: true, 290 }, 291 //设置屏幕显示满时,是否需要重头开始绘制 292 loop: { 293 margin: 2, 294 gradient: true 295 } 296 } 297 }, 298 }, 299} 300``` 301 302> **说明:** 303> - options只支持柱状图和线形图设置参数,量规图不生效。 304> 305> - datasets只支持柱状图和线形图设置数据集合,量规图不生效。 306> 307> - series只有线形图支持。 308 309 310## 添加数据 311 312通过chart组件的append方法,实现动态添加数据。 313 314 315```html 316<!-- xxx.hml --> 317<div class="container"> 318 <stack class="chart-region"> 319 <chart class="chart-data" type="line" ref="linechart" options="{{lineOps}}" datasets="{{lineData}}"></chart> 320 </stack> 321 <button value="Add data" onclick="addData"></button> 322</div> 323``` 324 325 326```css 327/* xxx.css */ 328.container { 329 flex-direction: column; 330 justify-content: center; 331 align-items: center; 332 background-color: #F1F3F5; 333} 334.chart-region { 335 height: 400px; 336 width: 700px; 337} 338.chart-data { 339 width: 700px; 340 height: 600px; 341} 342button { 343 width: 100%; 344 height: 50px; 345 background-color: #F4F2F1; 346 text-color: #0C81F3; 347 margin-top: 30px; 348} 349``` 350 351 352```js 353// xxx.js 354export default { 355 data: { 356 lineData: [ 357 { 358 strokeColor: '#de0b6e', 359 fillColor: '#bb09a3', 360 data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], 361 gradient: true, 362 } 363 ], 364 lineOps: { 365 xAxis: { 366 min: 0, 367 max: 20, 368 display: false, 369 }, 370 yAxis: { 371 min: 0, 372 max: 1000, 373 display: false, 374 }, 375 series: { 376 lineStyle: { 377 width: "5px", 378 smooth: true, 379 }, 380 headPoint: { 381 shape: "circle", 382 size: 20, 383 strokeWidth: 5, 384 fillColor: '#ffffff', 385 strokeColor: '#f8145c', 386 display: true, 387 }, 388 loop: { 389 margin: 2, 390 gradient: true, 391 } 392 } 393 }, 394 }, 395 addData() { 396 this.$refs.linechart.append({ 397 serial: 0, 398 data: [Math.floor(Math.random() * 400) + 200] 399 }) 400 } 401} 402``` 403 404 405 406 407## 场景示例 408 409开发者可以根据开关Switch的状态来选择数据展示的状态,当Switch状态为true时,通过定时器来实现数据的动态展示。 410 411 412```html 413<!-- xxx.hml --> 414<div class="container"> 415 <div class="container"> 416 <div class="switch-block"> 417 <text class="title">{{ title }} </text> 418 <switch class="switch" showtext="{{ showText }}" allow-scale="{{ allowScale }}"onchange="change"> 419 </switch> 420 </div> 421 <tabs class="tabs" index="0" vertical="false" onchange="changes"> 422 <tab-content class="tabcontent" scrollable="true"> 423 <div> 424 <tabs class="tabs" index="0" vertical="false" onchange="changes"> 425 <tab-content class="tabcontent" scrollable="true"> 426 <div class="line-class"> 427 <div class="bar-block"> 428 <chart class="chart-data" type="line" ref="linechart" options="{{ lineOps }}" 429 datasets="{{ lineData }}"> 430 </chart> 431 </div> 432 <div class="bar-block"> 433 <chart class="data-bar" type="bar" id="bar-chart" options="{{ barOps }}"datasets="{{ barData }}"> 434 </chart> 435 </div> 436 </div> 437 </tab-content> 438 </tabs> 439 </div> 440 <div> 441 <div class="container"> 442 <list class="todo-wrapper"> 443 <list-item for="{{ barData }}" class="todo-item"> 444 <text class="todo-title">{{ $item.data }}</text> 445 </list-item> 446 </list> 447 <list class="todo-wrapper"> 448 <list-item for="{{ lineData.data }}" class="todo-item"> 449 <text class="todo-title">{{ $item.value }}</text> 450 </list-item> 451 </list> 452 </div> 453 </div> 454 </tab-content> 455 </tabs> 456 </div> 457</div> 458``` 459 460 461```css 462/* xxx.css */ 463.container{ 464 display:flex; 465 flex-direction:column; 466 background-color: #F1F3F5; 467} 468.line-class{ 469 display: flex; 470 flex-direction: column; 471} 472.title{ 473 font-size: 40px; 474 margin-left: 40px; 475} 476.switch-block { 477 margin-top: 30px; 478 width: 98%; 479 height: 80px; 480 display: flex; 481 justify-content: space-between; 482} 483.switch{ 484 font-size: 40px; 485} 486.bar-block { 487 margin-top: 80px; 488 margin-left: 40px; 489 position: relative; 490 width: 90%; 491 border-radius: 10px; 492 background-color: #25FAB27B; 493 height: 40%; 494 justify-content: center; 495} 496``` 497 498 499```js 500// xxx.js 501export default { 502 data: { 503 interval: null, 504 title: "数据展示", 505 allowScale: true, 506 dataLength: 30, 507 barGroup: 3, 508 lineData: null, 509 lineOps: { 510 xAxis: { 511 min: 0, 512 max: 5 513 }, 514 yAxis: { 515 min: 0, 516 max: 100 517 }, 518 series: { 519 lineStyle: { 520 width: '1px', 521 }, 522 headPoint: { 523 shape: 'circle', 524 size: 10, 525 strokeWidth: 2, 526 fillColor: '#ffffff', 527 strokeColor: '#8477DF' 528 }, 529 loop: { 530 margin: 2 531 } 532 } 533 }, 534 barData: [ 535 { 536 fillColor: '#97CF0A2C', 537 data: [20, 20,40, 56] 538 }, 539 { 540 fillColor: '#6D0A7ACF', 541 data: [52, 40, 2, 67] 542 }, 543 { 544 fillColor: '#6A0ACFA1', 545 data: [56, 2, 77, 40] 546 } 547 ], 548 barOps: { 549 xAxis: { 550 min: 0, 551 max: 20, 552 axisTick: 5 553 }, 554 yAxis: { 555 min: 0, 556 max: 100 557 } 558 } 559 }, 560 onInit() { 561 this.changeLine(); 562 }, 563 change(e) { 564 if (e.checked) { 565 this.interval = setInterval(() => { 566 this.changeLine(); 567 this.changeBar(); 568 }, 1000) 569 } else { 570 clearInterval(this.interval); 571 } 572 }, 573 changeLine() { 574 var dataArray = []; 575 for (var i = 0; i < this.dataLength; i++) { 576 var nowValue = Math.floor(Math.random() * 99 + 1); 577 var obj = { 578 "value": nowValue, 579 "description": nowValue + "", 580 "textLocation": "top", 581 "textColor": "#CDCACA", 582 "pointStyle": { 583 "shape": "circle", 584 "size": 5, 585 "fillColor": "#CF0A2C", 586 "strokeColor": "#CF0A2C" 587 } 588 }; 589 dataArray.push(obj); 590 } 591 this.lineData = [ 592 { 593 strokeColor: '#0081ff', 594 fillColor: '#FF07CDC4', 595 data: dataArray, 596 gradient: true, 597 } 598 ] 599 }, 600 changeBar() { 601 for (var i = 0;i < this.barGroup; i++) { 602 var dataArray = this.barData[i].data; 603 for (var j = 0;j < 4; j++) { 604 dataArray[j] = Math.floor(Math.random() * 99 + 1); 605 } 606 } 607 this.barData = this.barData.splice(0, this.barGroup + 1); 608 }, 609 changes(e) { 610 console.log("Tab index: " + e.index); 611 }, 612} 613 614 615 616 617 618``` 619 620