日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android如何實現動態滾動波形圖(心電圖)功能

瀏覽:22日期:2022-09-20 10:04:39
一、前言

最近涉及的某個醫療相關的業務,傳感器數據傳遞上來需要實現示波器的效果,心電圖的效果,目前交付效果還算理想,于是封裝了一下,方便自己以后使用,也給大家分享一下

二、效果圖

Android如何實現動態滾動波形圖(心電圖)功能

圖一是心電圖效果,圖二是一個滾動的波形圖

三、功能實現

(一)繪制背景網格為了讓他看上去像示波器上的數據,我們先繪制一層網格背景,看上去似乎就有那么點意思了

在onLayout函數中獲取控件寬高,然后除以默認網格的寬高,得出需要繪制橫線和豎線的數量

/** 根據網格的單位長寬,獲取能繪制網格橫線和豎線的數量*/ gridHorizontalNum = (int) (mHeight / GRID_WIDTH); gridVerticalNum = (int) (mWidth / GRID_WIDTH);

在onDraw函數中,通過for循環,來一條條繪制橫線和豎線

/** * 繪制網格 * * @param canvas */ private void drawGrid(Canvas canvas) { /** 設置顏色*/ mLinePaint.setColor(gridLineColor); /** 繪制橫線*/ for (int i = 0; i < gridHorizontalNum + 1; i++) { canvas.drawLine(0, i * GRID_WIDTH, mWidth, i * GRID_WIDTH, mLinePaint); } /** 繪制豎線*/ for (int i = 0; i < gridVerticalNum + 1; i++) { canvas.drawLine(i * GRID_WIDTH, 0, i * GRID_WIDTH, mHeight, mLinePaint); } }

網格是靜態的,所以繪制起來比較簡單

(二)繪制折線

折線的繪制有兩種模式,也就是效果圖上下兩種效果的區別

原理也比較簡單

1、首先和繪制網格一樣,在onLayout函數中根據每段數據線條的跨度,算出當前view能繪制多少條直線同時創建一個浮點類型的數組,用于保存每次傳進來的數據

/** 根據線條長度,最多能繪制多少個數據點*/ row = (int) (mWidth / WAVE_LINE_WIDTH); dataArray = new float[row + 10];

2、來看數據的保存方式

心電圖效果的保存方式是創建了一個索引,每次繪制后自增,索引達到數組的最大值時,賦值為0

也就實現了循環的效果

普通的滾動效果的,就是刪除第一個,新增的數據添加至數組的末尾

/** * 添加新的數據 */ public void showLine(float line) { if (draw_index >= row) { draw_index = 0; } switch (drawMode){ case 0: /** 常規模式數據添加至最后一位*/ dataArray[row - 1] = line; break; case 1: /** 循環模式數據添加至當前繪制的位*/ dataArray[draw_index] = line; break; } postInvalidate(); }

3、繪制折線的流程

默認最大值為20,以view高度的一半處為0,下方是-20,上方是+20

x沒什么好說的,就是i*單位寬度

y則為高度的一半減去數組中數據占view一半高度的比重

將所有的點坐標傳入Path類中,最后使用Canvas的drawPath函數就可以繪制出想要有的效果了

/** * 取數組中的指定一段數據來繪制折線 * @param start 起始數據位 * @param end 結束數據位 * */ private void drawPathFromDatas(Canvas canvas, int start, int end){ mPath.reset(); mPath.moveTo(start * WAVE_LINE_WIDTH, mHeight / 2); for (int i = start; i < end; i++) { nowX = i * WAVE_LINE_WIDTH; float dataValue = dataArray[i]; /** 判斷數據為正數還是負數 超過最大值的數據按最大值來繪制*/ if (dataValue > 0) { if (dataValue > MAX_VALUE) { dataValue = MAX_VALUE; } } else { if (dataValue < -MAX_VALUE) { dataValue = -MAX_VALUE; } } nowY = mHeight / 2 - dataValue * (mHeight / (MAX_VALUE * 2)); mPath.lineTo(nowX, nowY); } canvas.drawPath(mPath, mWavePaint); }四、如何使用

(一)添加庫

allprojects { repositories { ... maven { url ’https://jitpack.io’ } } }

(二)布局文件

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical' tools:context='.MainActivity'> <TextView android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='波形圖1' android:textColor='#000000' android:textSize='24sp' /> <com.giftedcat.wavelib.view.WaveView android: android:layout_width='match_parent' android:layout_height='1dp' android:layout_weight='1' app:draw_mode='loop' app:max_value='30' app:wave_background='#000000' app:wave_line_color='#ffff00' app:wave_line_width='20' /> <TextView android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='波形圖2' android:textColor='#000000' android:textSize='24sp' /> <com.giftedcat.wavelib.view.WaveView android: android:layout_width='match_parent' android:layout_height='1dp' android:layout_weight='1' app:draw_mode='normal' app:grid_visible='false' app:wave_line_stroke_width='5' /></LinearLayout>

xml中可使用的參數

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='WaveView'> <!--最大值 默認為20,數據為-20 ~ 20--> <attr name='max_value' format='integer' /> <!--波形圖折線單位寬度,通過修改該參數,控制橫坐標的單位--> <attr name='wave_line_width' format='integer' /> <!--波形圖折線的線寬--> <attr name='wave_line_stroke_width' format='integer' /> <!--波形圖折線的顏色--> <attr name='wave_line_color' format='string' /> <!--背景網格圖的顏色--> <attr name='grid_line_color' format='string' /> <!--背景顏色,默認為黑--> <attr name='wave_background' format='string'/> <!--背景網格是否可見--> <attr name='grid_visible' format='boolean' /> <!--波形圖繪制模式,常規和循環--> <attr name='draw_mode' format='enum'> <enum name='normal' value='0' /> <enum name='loop' value='1' /> </attr> </declare-styleable></resources>

(三)向波形圖中添加數據

data = new Random().nextFloat()*(20f)-10f; waveShowView.showLine(data);//取得是-10到10間的浮點數

源碼地址:

https://github.com/Giftedcat/Waveform

到這里就結束啦.

以上就是Android如何實現動態滾動波形圖(心電圖)功能的詳細內容,更多關于Android 實現動態滾動波形圖(心電圖)功能的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
夜久久久久久| 国产亚洲在线| 日韩一区二区三区在线看| 视频精品一区二区| 日韩精品三区四区| 日韩精品一页| 国产精品亚洲片在线播放| 久久99精品久久久野外观看| 久久伊人国产| 99视频精品全国免费| 欧美+日本+国产+在线a∨观看| 最新亚洲一区| 天堂精品久久久久| 美女在线视频一区| 99久久99久久精品国产片果冰| 香蕉成人久久| 国产精品男女| 日韩毛片在线| 婷婷综合电影| 日本一区二区高清不卡| 欧洲亚洲一区二区三区| 视频精品一区二区| 久久的色偷偷| 亚洲精品99| 国产精品亚洲二区| 99精品在线免费在线观看| 中文字幕免费一区二区| 久久男人av| 国产真实久久| 欧美日韩在线精品一区二区三区激情综合| 久久天堂影院| 免费不卡在线观看| av日韩中文| 蜜臀av在线播放一区二区三区| 欧美激情福利| 婷婷丁香综合| 国产精品久一| 亚洲一区激情| 成人在线视频免费| 亚洲+小说+欧美+激情+另类| 精品1区2区3区4区| 精品久久久网| 亚洲精品影视| 美女毛片一区二区三区四区| 国产精品久久久久77777丨| 欧洲激情综合| a国产在线视频| 91福利精品在线观看| 波多野结衣一区| 国产一区精品福利| 日韩av一级| 国产精品tv| 亚洲小说春色综合另类电影| se01亚洲视频 | 成人亚洲精品| 亚洲精品少妇| 欧美精品一区二区久久| 久久99免费视频| 在线亚洲激情| 亚洲女同av| 国产黄色一区| 91免费精品国偷自产在线在线| 91精品福利| 中文字幕高清在线播放| 欧美日韩亚洲一区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 色爱av综合网| 成人日韩av| 国产日韩欧美一区二区三区在线观看| 黄色亚洲在线| 激情久久中文字幕| 国产资源在线观看入口av| 欧美日韩精品一区二区三区视频| www成人在线视频| 精品国产乱码久久久久久1区2匹| 日韩高清一区二区| 久久亚洲风情| 精品1区2区3区4区| 亚洲韩日在线| 久久国产影院| 日韩美女一区二区三区在线观看| 国产精品2023| 国产日韩三级| 国产日韩高清一区二区三区在线| 综合一区av| 亚洲资源网站| 亚洲日产国产精品| 亚洲欧美成人综合| 五月婷婷亚洲| 欧美日韩国产在线观看网站| 欧美91福利在线观看| 久久激情婷婷| 久久香蕉国产| 狠狠爱www人成狠狠爱综合网| 亚洲网站视频| 偷拍欧美精品| 三级欧美韩日大片在线看| 日韩午夜黄色| 亚洲欧美日韩视频二区| 美女国产一区| 亚洲精品国产精品粉嫩| 亚洲精品婷婷| 国产伦精品一区二区三区视频| 国产精品99久久免费| 国产欧美午夜| 精品一区91| 中文字幕在线看片| 久久要要av| 99亚洲视频| 最新国产精品| 国产精品久久| 日韩视频网站在线观看| 精精国产xxxx视频在线播放 | 精品国产亚洲一区二区三区| 精品一区二区三区四区五区| 丝袜美腿诱惑一区二区三区| 精品91久久久久| 亚洲一区日本| 日本少妇一区二区| 国产成人精品一区二区免费看京| 日韩一区电影| 亚洲免费在线| 国产精品久一| 亚洲第一区色| 日韩综合一区二区| 精品国产不卡| 国产精品7m凸凹视频分类| 亚洲精品在线国产| 色婷婷色综合| 久久成人一区| 麻豆极品一区二区三区| 久久九九电影| 亚洲在线观看| 麻豆成人综合网| 午夜欧美在线| 久久国产乱子精品免费女| 成人美女视频| 亚洲无线观看| 精品久久久久久久| 亚洲综合不卡| 国产一区二区色噜噜| 红桃视频欧美| 欧美经典一区| 99国产精品视频免费观看一公开| 欧美日本精品| 91成人精品| 国产探花在线精品一区二区| 久久影院一区二区三区| 久久久久久久久久久妇女| 日韩动漫一区| 亚洲成人二区| 国产日产一区| 欧美美女一区| 精品伊人久久| 亚洲狼人精品一区二区三区| 黑人精品一区| 青草久久视频| 亚洲欧洲一区二区天堂久久| 欧美国产三级| 麻豆精品91| 偷拍精品精品一区二区三区| 日本91福利区| 久久久人人人| 国产极品一区| 中文字幕中文字幕精品| 久久婷婷亚洲| 精品视频自拍| 日韩国产91| 丝袜美腿亚洲色图| 99精品电影| 欧美好骚综合网| 久久国产精品色av免费看| 尤物精品在线| 色婷婷狠狠五月综合天色拍| 欧美aa在线视频| 少妇高潮一区二区三区99| 蜜桃视频欧美| 麻豆视频久久| 国产精品中文字幕制服诱惑| 蜜桃传媒麻豆第一区在线观看| 日韩欧美精品| 欧美国产日本| 国产精品欧美大片| 午夜久久av | av亚洲免费| 蜜桃av.网站在线观看| 国产精品久久久久久久久久久久久久久 | 国产日韩视频| 日本国产欧美| 中文字幕av一区二区三区四区| 欧美福利一区| 99国产精品一区二区| 一区二区三区四区日本视频| 精品日本视频| 美女视频黄久久| 久久99精品久久久久久园产越南| 日韩av中文字幕一区| 亚洲青青久久| 日韩 欧美一区二区三区| 亚洲精品韩国|