HarmonyOS - 基于ArkUI(ETS) 實(shí)現(xiàn)心電圖組件
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
前言
隨著大家生活水平的提升,越來(lái)越多的人注重自身身心健康,養(yǎng)生成了目前比較熱門的活動(dòng)。心電圖是檢測(cè)心臟活動(dòng)狀態(tài)的直觀表現(xiàn),可以通過(guò)心電圖來(lái)觀察人提的健康狀況。
響應(yīng)鴻蒙萬(wàn)物互聯(lián)的口號(hào),肯定少不了智能設(shè)備和心電檢測(cè)設(shè)備的互聯(lián)。所以本文實(shí)現(xiàn)了簡(jiǎn)單的心電圖功能UI展示。
效果圖
組件API
ygEcg
屬性名 | 類型 | 默認(rèn)值 | 描述 |
ecgData | - | 配置心電圖的信息 |
接口 EcgDataType
參數(shù)名 | 參數(shù)類型 | 必填 | 默認(rèn)值 | 參數(shù)描述 |
data | Array<number> | 是 | - | 心電數(shù)據(jù)源 |
timeStep | number | 是 | 40 | 每一小格代表時(shí)間(毫秒),x軸方向 |
mvStep | number | 是 | 0.1 | 每小格表示電壓(毫伏/mv),y軸方向 |
waveLineColor | string | 是 | - | 波線顏色 |
gridColor | Array<string> | 是 | - | 網(wǎng)格顏色,第一個(gè)為小網(wǎng)格,第二個(gè)為大網(wǎng)格 |
maxTime | number | 是 | - | 圖標(biāo)顯示最大時(shí)間區(qū)域(毫秒) |
width | number | 是 | - | 畫(huà)布寬度 |
height | number | 是 | - | 畫(huà)布高度 |
backgroundColor | string | 是 | - | 畫(huà)布背景色 |
組件調(diào)用
實(shí)現(xiàn)前的準(zhǔn)備
在寫(xiě)這個(gè)demo之前,以為心電圖應(yīng)該就是現(xiàn)在簡(jiǎn)單的上下波動(dòng)的折線圖。
實(shí)現(xiàn)原理
通過(guò)使用canvas組件,繪制一個(gè)類似醫(yī)學(xué)上的心電圖紙網(wǎng)格,然后通過(guò)心電源數(shù)據(jù),繪制對(duì)應(yīng)的折線形成心電波形。
實(shí)現(xiàn)過(guò)程
1、創(chuàng)建canvas畫(huà)布
2、繪制小網(wǎng)格
因?yàn)橥ㄉ厦娴男碾姴ㄐ螆D解得知,默認(rèn)一個(gè)小網(wǎng)格的走紙速度是0.04秒,也就是40毫秒,通過(guò)傳入的數(shù)據(jù)timeStep字段控制
那么要繪制多少個(gè)小格呢?通過(guò)畫(huà)布寬度,和maxTime字段(最大的顯示時(shí)間,上面代碼案例是6000毫秒)可以計(jì)算得知,將要繪制。
6000/40=150小格。
3、繪制大網(wǎng)格
每1大格等于5小格。
最后繪制的結(jié)果如圖:
4、繪制心電波形
獲取畫(huà)布高度的一半位置,作為心電波形的基線,在基線的基礎(chǔ)上,通過(guò)心電數(shù)據(jù)源,將每個(gè)數(shù)據(jù)在基線上通過(guò)對(duì)數(shù)據(jù)的偏于來(lái)繪制點(diǎn)線,最后形成一個(gè)折線狀態(tài)的心電波形線。
刷新預(yù)覽器看看效果:
5、最后一步實(shí)現(xiàn)心跳的動(dòng)畫(huà)效果
這里的動(dòng)畫(huà)刷新時(shí)間是根據(jù)配置的心電圖步長(zhǎng)來(lái)做定時(shí)器的時(shí)間,默認(rèn)是40毫秒,也就是每一小格走紙的時(shí)間。這樣就可以保持跟實(shí)際時(shí)間對(duì)應(yīng),不會(huì)出現(xiàn)心跳快慢的問(wèn)題。
當(dāng)然,這里還是有寫(xiě)誤差的,因?yàn)榇a執(zhí)行的過(guò)程也是消耗時(shí)間的,會(huì)比實(shí)際時(shí)間多一丟丟。
最后再來(lái)看一下心電圖的動(dòng)畫(huà)效果:
代碼地址
??https://gitee.com/yango520/yg-ecg2??
總結(jié)
繪制這個(gè)心電圖沒(méi)有用到重繪機(jī)制,動(dòng)畫(huà)效果是每次繪制的時(shí)候覆蓋在原有的波形線上的,但是這樣會(huì)比重繪整個(gè)畫(huà)布性能更好一些。
通過(guò)實(shí)現(xiàn)這個(gè)demo之后,對(duì)心電圖上的信息有了全新的了解,我覺(jué)得大家都可以去學(xué)會(huì)看心電圖來(lái)分析心臟狀況,自己理解了總比別人告知更有說(shuō)服力。
避坑小技巧
- 當(dāng)代碼大變更的時(shí)候(一般復(fù)制出來(lái)單獨(dú)做一個(gè)文件的時(shí)候),需要在build選項(xiàng)卡里清理項(xiàng)目,不然也不報(bào)錯(cuò),也不刷新,但是樣式就是錯(cuò)亂。
- 預(yù)覽器開(kāi)久了之后,當(dāng)一段時(shí)間不動(dòng)了,再次刷新開(kāi)啟都一直卡著開(kāi)啟中進(jìn)不去,需要關(guān)閉IDE重新打開(kāi)才可以用。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??