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