当前位置: 首页 > 科技观察

【鸿蒙图解】使用绘图组件Canvas绘制心率曲线

时间:2023-03-13 07:32:53 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz1.运行效果在页面上显示页面标题、心率图表、最大心率及其图标、最小心率及其图标、每分钟平均心率次数。如下图所示:2.实现思路在页面的生命周期事件函数onInit()中,随机生成指定范围内的若干个整数作为所有心率数据。根据随机生成的整数计算所有心率的最大值、最小值和平均值,通过动态绑定显示在页面上。使用组件图绘制心率曲线。通过动态绑定指定组件图表中属性options和datasets的值来设置图表的参数。3.详细代码解释打开文件index.hml。将组件文本中显示的页面标题更改为:心率曲线,并在其外层嵌套一个组件div来设置其样式。将组件div的属性class值设置为“title-container”。在页面标题下方添加一个组件div,用于显示心率图,并将属性类的值设置为“图表”。在心率图下方添加一个组件列表,用于显示心率的最大值、最小值和图标,并将属性类的值设置为“列表”。在组件列表中嵌套一个组件list-item来显示列表中的每一个列表项,并设置属性类的值为“list-item”。通过动态绑定指定属性值为"{{maxmin}}",从而在index.js中迭代data中的maxmin。每个列表项由图片和文本组成,因此在组件列表项中添加组件图像和组件文本。在组件图片中,将属性class的值设置为“icon”,通过动态绑定将属性src的值设置为“/common/{{$item.iconName}}.png”。这样report2.js中data中的maxmin可以是一个字典数组,数组中的每个字典都包含一个key为iconName的元素。在组件文本中,将属性类的值设置为“maxmin”,通过动态绑定将显示的文本设置为“{{$item.mValue}}”。这样对于index.js中data中的数组maxmin,其中的每一个字典都包含一个key为mValue的元素。在列表下方添加一个组件div,用于显示一分钟内的心率平均值,并将属性类设置为值“average-container”。定义嵌套在组件div中的三个组件text,属性类的取值为:"average"、"average-number"和"average",显示的文本分别为:average、{{average}}、times/观点。以上解释请看下面代码:心率曲线

divclass="chart">
{{$item.mValue}}平均{{average}}次/分钟
打开文件索引。CSS。删除类选择器容器中的样式显示、左侧和顶部。将flex-direction的值设置为column以垂直排列容器中的所有组件。将justify-content的值改为flex-start,使容器内的所有组件在主轴上向上对齐。删除类选择器标题中的样式text-align、width和height。将font-size的值更改为38px。将margin-top的值设置为40px以保持页面标题与页面上边缘的间距。添加一个名为title-container的类选择器来设置页面标题的样式。将justify-content和align-items都设置为center以使容器中的组件水平和垂直居中。设置宽高值分别为300px和130px。添加一个名为chart的类选择器来设置心率图的样式。设置宽高值分别为400px和180px。添加一个名为list的类选择器来设置列表的样式。将flex-direction的值设置为row以水平排列所有列表项。设置宽高值分别为240px和45px。添加一个名为list-item的类选择器来设置列表项的样式。将justify-content和align-items都设置为center以使列表项内的组件水平和垂直居中。设置宽高值分别为120px和45px。添加一个名为icon的类选择器来设置心率最大和最小图标的样式。设置宽高值分别为32px和32px。添加一个名为maxmin的类选择器来设置心率的最大和最小文本样式。将font-size的值设置为24px。将letter-spacing值设置为0px以使数字间隔更紧密。添加一个名为average-container的类选择器来设置与心率平均值相关联的文本的样式。将justify-content的值设置为space-between以水平对齐容器内的组件。将align-items的值设置为center使组件在容器中垂直居中。设置宽高值分别为280px和55px。添加一个名为average-number的类选择器来设置心率平均值的样式。将font-size的值设置为38px。将letter-spacing值设置为0px以使数字间隔更紧密。添加一个名为average的类选择器来设置心率平均值两侧的文本样式。将font-size的值设置为24px。将颜色的值设置为灰色,以灰色显示文本。以上解释请参考以下代码:.container{display:flex;flex-direction:column;justify-content:flex-start;align-items:center;left:0px;top:0px;width:454px;高度:454px;}.title-container{justify-content:center;align-items:center;width:300px;height:130px;}.title{margin-top:40px;font-size:38px;text-align:center;width:454px;height:100px;}.chart{width:400px;height:180px;}.list{flex-direction:row;width:240px;height:45px;}.list-item{justify-content:center;align-items:center;width:120px;height:45px;}.icon{width:32px;height:32px;}.maxmin{font-size:24px;letter-spacing:0px;}.average-container{justify-content:空间之间;对齐项目:中心;宽度:280px;高度:55px;}.average{字体大小:24px;颜色:灰色;}.average-number{字体大小:38px;字母间距:0px;}在common目录下添加心率最大值图标max.png和心率最小值图标min.png。打开文件index.js。将data中的占位符maxmin初始化为字典数组。该数组包含两个字典,分别表示最大心率和最小心率的信息。每个字典中有两个元素,对应的key是iconName和mValue,分别代表图标名称和心率最大值。对于第一个字典,将心率最大值的图标名称初始化为'max'并将心率最大值初始化为0。对于第二个字典,将心率最小值的图标名称初始化为'min'并初始化心率最小值到0.将数据中的占位符平均值初始化为0。以上解释请看下面代码:importrouterfrom'@system.router'exportdefault{data:{maxmin:[{iconName:'max',mValue:0},{iconName:'min',mValue:0}],average:0}}在index.js中自定义一个名为getRandomInt的函数,用于随机生成一个介于min和max之间(包括min和max)的整数。在页面的生命周期事件函数onInit()中,首先创建一个空数组赋值给局部作用域变量heartRates,然后通过for循环执行100次迭代。在每次迭代中,调用自定义函数getRandomInt()随机生成一个介于73和159之间的整数,并调用函数push()将随机生成的整数添加到数组heartRates中。定义一个函数countMaxMinAverage,形参为heartRates,该函数用于计算heartRates中所有元素的最大值、最小值和平均值。在函数onInit()的最后,调用自定义函数countMaxMinAverage(),将heartRates作为实参传递给形参heartRates。以上解释请看下面代码:importrouterfrom'@system.router'exportdefault{data:{...},onInit(){leheartRates=[];for(leti=0;i<100;i++){heartRates.push(this.getRandomInt(73,159));}this.countMaxMinAverage(heartRates);},getRandomInt(min,max){returnMath.floor(Math.random()*(max-min+1))+min;},countMaxMinAverage(heartRates){}}在自定义函数countMaxMinAverage()的函数体中,调用Math.max.apply()和Math.min.apply()计算数组heartRates中的最大值和最小值,然后分别给data中的maxmin[0].mValue和maxmin[1].mValue赋值。通过for循环遍历数组heartRates中的所有心率数据,并在遍历过程中将心率数据添加到局部作用域变量sum中,计算出数组heartRates中所有心率数据的总和。求和后除以所有心率数据的个数,得到所有心率数据的平均值。调用函数Math.round()返回最接近心率平均值的整数,赋值给data中的平均值。上面的解释请看下面代码:importrouterfrom'@system.router'exportdefault{......countMaxMinAverage(heartRates){this.maxmin[0].mValue=Math.max.apply(null,heartRates);this.maxmin[1].mValue=Math.min.apply(null,heartRates);letsum=0;for(letindex=0;index心率曲线chartclass="图表"options="{{options}}"datasets="{{datasets}}"/>…………