Android心电动态显示及保存

    项目描述:下位机采集心电和心率数据通过蓝牙传给手机,手机将接收得到的心电数据用心电图描绘出来,同时显示心率值。每次采集的数据都会保存下来以便日后查询。

    实现方案:包含几大部分:蓝牙传输部分,接收数据包解包部分,绘制波形部分,动态显示心率值部分,数据的保存与读取部分。通过蓝牙读取数据,绘制心电波形,保存文件都是耗费时间的工作,所以各自开三个线程。使用蓝牙功能要在Manifest文件里声明使用权限和管理权限,代码部分就是按照步骤一步一步地实现。心率值显示用Handler()方法实现实时更新。

    这里列举绘制心电波形的代码,主要用到了Serfaceview和Thread:

public void dawECGWave() {

 

new Thread() {

public void run() {

int newX = 0;// 当前绘制的x坐标

float newY = 0;// 当前绘制的y坐标

int baseLine;// 基线

Paint mPaint;// 画笔

Canvas canvas;// 画布

oldY = -1;

int n = 2;

 

while (!stopDrawWaveThread) {

          

if (start > sfv.getWidth()) {

start = 0;

oldX = 0;

Log.d("Clear", "Clear");

}

                

canvas = sfv.getHolder().lockCanvas(

new Rect( start, 0,  start + 15, sfv

.getBottom()));

canvas.drawColor(Color.TRANSPARENT,

android.graphics.PorterDuff.Mode.CLEAR); // 清除上次绘制

 

 

canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));

 

baseLine = canvas.getHeight() / 2;

 

mPaint = new Paint();

mPaint.setColor(Color.GREEN);

mPaint.setAntiAlias(true);// /平滑线

mPaint.setStrokeWidth(1.6f);// /画笔宽

 

if (dataQueue.size() >= 5) {

newX = oldX + 5 * speed;

 

int data = 16384;

 

int dataTmp = dataQueue.poll();

if (Math.abs(16384 - dataTmp) > Math.abs(16384 - data)) {

data = dataTmp;

}

dataTmp = dataQueue.poll();

if (Math.abs(16384 - dataTmp) > Math.abs(16384 - data)) {

data = dataTmp;

}

dataTmp = dataQueue.poll();

if (Math.abs(16384 - dataTmp) > Math.abs(16384 - data)) {

data = dataTmp;

}

dataTmp = dataQueue.poll();

if (Math.abs(16384 - dataTmp) > Math.abs(16384 - data)) {

data = dataTmp;

}

dataTmp = dataQueue.poll();

if (Math.abs(16384 - dataTmp) > Math.abs(16384 - data)) {

data = dataTmp;

}

                        

newY = (float) ((16384 - data) * 0.00107 * 15 * gain + baseLine);// /Y值计算方法

 

if(oldY == -1){

oldX = 0;

oldY = newY;

start = oldX;

sfv.getHolder().unlockCanvasAndPost(canvas);

continue;

}

canvas.drawLine(oldX, oldY, newX, newY, mPaint);

canvas.drawLine(oldX, oldY+1, newX, newY+1, mPaint);

oldX = newX;

oldY = newY;

}

 

start = oldX;

sfv.getHolder().unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像

}

}

}.start();

}

其他代码就不一一列举,有兴趣的话可以找我交流。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。