成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【圖解鴻蒙】使用繪圖組件Canvas繪制心率曲線圖

開發
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

一、運行效果

在頁面中顯示頁面標題、心率曲線圖、心率最大值及其圖標、心率最小值及其圖標、心率在每分鐘內的平均次數。如下圖所示:

二、實現思路

在頁面的生命周期事件函數onInit()中,隨機生成若干個指定范圍內的整數,以作為所有的心率數據。根據隨機生成的整數統計所有心率的最大值、最小值和平均值,并通過動態綁定的方式將其顯示在頁面中。使用組件chart繪制心率曲線圖。通過動態綁定的方式指定組件chart中屬性options和datasets的值,以對圖形的參數進行設置。

三、代碼詳解

打開文件index.hml。

將組件text中顯示的頁面標題修改為:心率曲線,并在其外層嵌套一個組件div,以便對其樣式進行設置。將該組件div的屬性class的值設置為"title-container"。

在頁面標題的下方添加一個組件div以顯示心率曲線圖,并將屬性class的值設置為"chart"。

在心率曲線圖的下方添加一個組件list,以顯示心率的最大值、最小值及其圖標,并將屬性class的值設置為"list"。

在組件list的內部嵌套一個組件list-item以顯示列表中的每個列表項,并將屬性class的值設置為"list-item"。通過動態綁定的方式指定屬性for的值為"{{maxmin}}",從而對index.js中data里面的maxmin進行迭代。

每個列表項都由一張圖片和一個文本組成,因此在組件list-item中添加一個組件image和一個組件text。

在組件image中將屬性class的值設置為"icon",并通過動態綁定的方式將屬性src的值設置為"/common/{{$item.iconName}}.png"。這樣,report2.js中data里面的maxmin可以是一個字典的數組,數組中的每個字典都包含一個key為iconName的元素。

在組件text中將屬性class的值設置為"maxmin",并通過動態綁定的方式將顯示的文本設置為"{{$item.mValue}}"。這樣,對于index.js中data里面的數組maxmin,其中的每個字典都包含一個key為mValue的元素。

在列表的下方添加一個組件div以顯示心率在一分鐘內的平均次數,并將屬性class的值設置為" average-container "。

在組件div中嵌套定義三個組件text,其屬性class的值分別為:"average"、"average-number"和"average",其顯示的文本分別為:平均、{{average}}、次/分。

上述講解請見如下代碼:

  1. <div class="container" onswipe="toNextPage"
  2.     <div class="title-container"
  3.         <text class="title"
  4.             心率曲線 
  5.         </text> 
  6.     </div> 
  7.     <div class="chart"
  8.  
  9.     </div> 
  10.     <list class="list"
  11.         <list-item class="list-item" for="{{maxmin}}"
  12.             <image class="icon" src="/common/{{$item.iconName}}.png"/> 
  13.             <text class="maxmin"
  14.                 {{$item.mValue}} 
  15.             </text> 
  16.         </list-item> 
  17.     </list> 
  18.     <div class="average-container"
  19.         <text class="average"
  20.             平均 
  21.         </text> 
  22.         <text class="average-number"
  23.             {{average}} 
  24.         </text> 
  25.         <text class="average"
  26.             次/分 
  27.         </text> 
  28.     </div> 
  29. </div> 

 打開文件index.css。

在類選擇器container中刪除樣式display、left和top。將flex-direction的值設置為column,以在豎直方向上排列容器內的所有組件。將justify-content的值修改為flex-start,以讓容器內的所有組件在主軸上向上對齊。

在類選擇器title中刪除樣式text-align、width和height。將font-size的值修改為38px。將margin-top的值設置為40px,以讓頁面標題與頁面的上邊緣保持一定的間距。

添加一個名為title-container的類選擇器,以設置頁面標題的樣式。將justify-content和align-items都設置為center,以讓容器內的組件在水平方向和豎直方向都居中對齊。將寬度width和高度height的值分別設置為300px和130px。

添加一個名為chart的類選擇器,以設置心率曲線圖的樣式。將寬度width和高度height的值分別設置為400px和180px。

添加一個名為list的類選擇器,以設置列表的樣式。將flex-direction的值設置為row,以在水平方向上排列所有列表項。將寬度width和高度height的值分別設置為240px和45px。

添加一個名為list-item的類選擇器,以設置列表項的樣式。將justify-content和align-items都設置為center,以讓列表項內的組件在水平方向和豎直方向都居中對齊。將寬度width和高度height的值分別設置為120px和45px。

添加一個名為icon的類選擇器,以設置心率的最大值圖標和最小值圖標的樣式。將寬度width和高度height的值分別設置為32px和32px。

添加一個名為maxmin的類選擇器,以設置心率的最大值文本和最小值文本的樣式。將font-size的值設置為24px。將letter-spacing的值設置為0px,以讓數字之間的間距更緊湊。

添加一個名為average-container的類選擇器,以設置心率平均值的相關文本的樣式。將justify-content的值設置為space-between,以讓容器內的組件在水平方向上兩端對齊。將align-items的值設置為center,以讓容器內的組件在豎直方向上居中對齊。將寬度width和高度height的值分別設置為280px和55px。

添加一個名為average-number的類選擇器,以設置心率平均值的樣式。將font-size的值設置為38px。將letter-spacing的值設置為0px,以讓數字之間的間距更緊湊。

添加一個名為average的類選擇器,以設置心率平均值的兩邊文本的樣式。將font-size的值設置為24px。將color的值設置為gray,以將文本顯示為灰色。

上述講解請見如下代碼:

  1. .container { 
  2.        display: flex; 
  3.     flex-direction: column
  4.     justify-content: flex-start; 
  5.     align-items: center; 
  6.     left: 0px; 
  7.     top: 0px; 
  8.     width: 454px; 
  9.     height: 454px; 
  10. .title-container { 
  11.     justify-content: center; 
  12.     align-items: center; 
  13.     width: 300px; 
  14.     height: 130px; 
  15. .title { 
  16.     margin-top: 40px; 
  17.     font-size: 38px; 
  18.     text-align: center; 
  19.     width: 454px; 
  20.     height: 100px; 
  21. .chart { 
  22.     width: 400px; 
  23.     height: 180px; 
  24. .list { 
  25.     flex-direction: row; 
  26.     width: 240px; 
  27.     height: 45px; 
  28. .list-item { 
  29.     justify-content: center; 
  30.     align-items: center; 
  31.     width: 120px; 
  32.     height: 45px; 
  33. .icon { 
  34.     width: 32px; 
  35.     height: 32px; 
  36. .maxmin { 
  37.     font-size: 24px; 
  38.     letter-spacing: 0px; 
  39. .average-container { 
  40.     justify-content: space-between
  41.     align-items: center; 
  42.     width: 280px; 
  43.     height: 55px; 
  44. .average { 
  45.     font-size: 24px; 
  46.     color: gray; 
  47. .average-number { 
  48.     font-size: 38px; 
  49.     letter-spacing: 0px; 

 把心率最大值圖標max.png和心率最小值圖標min.png添加到目錄common中。

打開文件index.js。

在data中將占位符maxmin初始化為一個字典數組。該數組中包含兩個字典,分別表示心率最大值和心率最小值的相關信息。每個字典中都有兩個元素,對應的key都是iconName和mValue,分別表示心率最值的圖標名稱和心率最值。對于第一個字典,將心率最大值的圖標名稱iconName初始化為'max',并將心率最大值初始化為0。對于第二個字典,將心率最小值的圖標名稱iconName初始化為'min',并將心率最小值初始化為0。

在data中將占位符average初始化為0。

上述講解請見如下代碼:

  1. import router from '@system.router' 
  2.  
  3. export default { 
  4.     data: { 
  5.         maxmin: [{ 
  6.                      iconName: 'max'
  7.                      mValue: 0 
  8.                  }, 
  9.                  { 
  10.                      iconName: 'min'
  11.                      mValue: 0 
  12.                  }], 
  13.         average: 0 
  14.     } 

 在index.js中自定義一個名為getRandomInt的函數,該函數用于隨機生成一個介于min和max之間(包含min和max)的整數。

在頁面的生命周期事件函數onInit()里,首先創建一個空數組并賦值給局部作用域變量heartRates,然后通過for循環執行100次迭代。在每一次迭代中,調用自定義函數getRandomInt()隨機生成一個介于73和159之間的整數,并調用函數push()將隨機生成的整數添加到數組heartRates中。

定義一個名為countMaxMinAverage的函數,其形參為heartRates,該函數用于計算heartRates中所有元素的最大值、最小值和平均值。

在函數onInit()的最后,調用自定義函數countMaxMinAverage (),并將heartRates作為實參傳遞給形參heartRates。

上述講解請見如下代碼:

  1. import router from '@system.router' 
  2.  
  3. export default { 
  4.     data: { 
  5.             ...... 
  6.     }, 
  7.     onInit() { 
  8.         let heartRates = []; 
  9.         for (let i = 0; i < 100; i++) { 
  10.             heartRates.push(this.getRandomInt(73, 159)); 
  11.         } 
  12.         this.countMaxMinAverage(heartRates); 
  13.     }, 
  14.     getRandomInt(minmax) { 
  15.         return Math.floor(Math.random() * (max - min + 1) ) + min
  16.     }, 
  17.     countMaxMinAverage(heartRates) { 
  18.  
  19.     } 

 在自定義函數countMaxMinAverage ()的函數體中,分別調用Math.max.apply()和Math.min.apply()計算數組heartRates中的最大值和最小值,然后分別賦值給data中的maxmin[0].mValue和maxmin[1].mValue。通過for循環對數組heartRates中的所有心率數據進行遍歷,在遍歷的過程中將心率數據累加到局部作用域變量sum,以計算數組heartRates中所有心率數據的總和。求出總和之后,將其除以所有心率數據的個數就得到了所有心率數據的平均值。調用函數Math.round()返回與心率平均值最接近的整數,并將其賦值給data中的average。

上述講解請見如下代碼:

  1. import router from '@system.router' 
  2.  
  3. export default { 
  4.         ...... 
  5.     countMaxMinAverage(heartRates) { 
  6.         this.maxmin[0].mValue = Math.max.apply(null, heartRates); 
  7.         this.maxmin[1].mValue = Math.min.apply(null, heartRates); 
  8.  
  9.         let sum = 0; 
  10.         for (let index = 0; index < heartRates.length; index++) { 
  11.             sum += heartRates[index]; 
  12.         } 
  13.         this.average = Math.round(sum / heartRates.length); 
  14.     }, 
  15.         ...... 

 保存所有代碼后打開模擬器,在頁面中顯示出了頁面標題、心率最大值及其圖標、心率最小值及其圖標、心率在每分鐘內的平均次數,運行效果如圖所示:


打開文件index.hml。

將組件list上方的組件div修改為chart,以繪制一張心率曲線圖。在組件chart中,通過動態綁定的方式將屬性options和datasets的值分別設置為"{{options}}"和"{{datasets}}"。

上述講解請見如下代碼:

  1. <div class="container" onswipe="toNextPage"
  2.     <div class="title-container"
  3.         <text class="title"
  4.             心率曲線 
  5.         </text> 
  6.     </div> 
  7.     <chart class="chart" options="{{options}}" datasets="{{datasets}}"/> 
  8.     <list class="list"
  9.         ......     
  10.     </list> 
  11.     ...... 
  12. </div 

 打開文件index.js。

在data中將占位符options的值初始化為一個字典,字典中包含兩個元素,分別用于設置x軸和y軸的參數。第一個元素的key是xAxis,對應的value是一個空字典{},說明不需要對x軸的參數進行設置。第二個元素的key是yAxis,對應的value是一個由兩個元素組成的字典,分別用于設置y軸的最小值和最大值,其中,key分別是min和max,value分別是0和160。

在data中將占位符datasets的值初始化為一個字典的數組,該數組中只包含一個字典,該字典中包含兩個元素。第一個元素的key是gradient,對應的value是true,用于表示折線向下填充顏色到x軸。第二個元素的key是data,對應的value是一個空數組[],用于指定心率圖中的數據。

在頁面的生命周期事件函數onInit()中,在隨機生成100個整數之后將所有整數組成的數組賦值給data中的datasets[0].data。

上述講解請見如下代碼:

  1. import router from '@system.router' 
  2.  
  3. export default { 
  4.     data: { 
  5.         ......       
  6.                 average: 0, 
  7.         options: { 
  8.             xAxis: {}, 
  9.             yAxis: { 
  10.                 min: 0, 
  11.                 max: 160 
  12.             } 
  13.         }, 
  14.         datasets: [{ 
  15.                        gradient: true
  16.                        data: [] 
  17.                    }] 
  18.     }, 
  19.     onInit() { 
  20.         let heartRates = []; 
  21.         for (let i = 0; i < 100; i++) { 
  22.             heartRates.push(this.getRandomInt(73, 159)); 
  23.         } 
  24.         this.datasets[0].data = heartRates; 
  25.         this.countMaxMinAverage(heartRates); 
  26.     }, 
  27.     ...... 

 保存所有代碼后打開模擬器,運行效果如下圖所示:


項目源代碼,請見附件。

歡迎訂閱我的專欄【圖解鴻蒙】:

https://harmonyos.51cto.com/column/27

©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請注明出處,否則將追究法律責任

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-01-06 10:05:09

鴻蒙HarmonyOSCanvas

2013-05-20 16:12:23

2013-06-09 11:18:44

C++程序員

2012-02-22 15:41:50

HTML 5

2022-06-10 15:51:22

機器學習數據模型學習

2011-04-20 09:37:59

amChartsWPF

2022-02-28 15:52:07

canvasHarmonyOS鴻蒙

2012-02-24 15:28:36

ibmdw

2011-08-12 08:56:31

JavaScript

2014-04-29 14:27:59

OpenGL ES 2Android繪制紋理

2022-02-23 15:17:04

鴻蒙OpenHarmonJacascript

2012-05-31 09:19:22

HTML5

2011-08-12 11:01:09

iPhone繪圖QuartZ繪制

2011-08-12 11:08:45

iPhone繪圖QuartZ繪制

2011-08-12 10:46:18

iPhone繪圖繪制QuartZ

2011-06-13 17:17:22

Qt 繪圖 QWT

2023-08-30 08:30:03

2020-12-28 10:15:18

鴻蒙HarmonyOSListContain

2022-12-18 22:11:46

2022-02-14 14:14:02

鴻蒙數據可視化JS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: japanhd成人| 天堂视频免费 | www.99精品| 久久人人爽人人爽 | 精品久久一区 | 狠狠操狠狠操 | 国产麻豆乱码精品一区二区三区 | 成人在线看片 | 人人射人人草 | 日本高清不卡视频 | 夜夜夜夜夜夜曰天天天 | 久热国产精品视频 | 亚洲三区视频 | 国产欧美一区二区三区在线看 | 日韩视频中文字幕 | 精品国产乱码久久久久久丨区2区 | 欧美做暖暖视频 | 欧美高清成人 | 国内精品久久久久 | 欧美日本在线观看 | 中文字字幕在线中文乱码范文 | 久久夜视频 | 三级在线视频 | 天天综合网天天综合色 | 97国产爽爽爽久久久 | 欧美激情久久久 | 国产精品久久久久aaaa九色 | 欧美日本一区 | 成人h电影在线观看 | 一级a性色生活片久久毛片 午夜精品在线观看 | 国产中文字幕亚洲 | 久久午夜精品福利一区二区 | 在线国产一区二区 | 一区二区三区视频播放 | 国产免费观看久久黄av片涩av | 日本在线免费观看 | 91久久看片 | 91天堂网| 91免费视频 | 天天干狠狠 | 精品欧美一区二区精品久久久 |