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();

}

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

时间: 2025-01-13 18:45:08

Android心电动态显示及保存的相关文章

Android中利用SharedPreferences保存信息

package com.example.sharepreferen; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.vi

Android app的文件保存目录

Android app的文件保存目录可以是app内置私有的目录,当然也可以选择外置sdcard目录 内置私有目录 /data/data/[packagename]/files 文件缓存目录,一般存小的文件缓存,如果是图片,不建议放这里,一般放到外置卡. File file = getFilesDir(); 返回该目录 写文件到该目录下可以像这样 FileOutputStream fos = null; try { fos = appontext.openFileOutput(name, Cont

Android native CursorWindow数据保存原理

我们通过Uri查询数据库所得到的数据集,保存在native层的CursorWindow中.CursorWindow的实质是共享内存的抽象,以实现跨进程数据共享.共享内存所采用的实现方式是文件映射. 在ContentProvider端透过SQLiteDatabase的封装查询到的数据集保存在CursorWindow所指向的共享内存中,然后通过Binder把这片共享内存传递到ContentResolver端,即查询端.这样客户就可以通过Cursor来访问这块共享内存中的数据集了. 那么CursorW

Android之使用SharedPreferences保存用户偏好参数

在Android应用中,我们常需要记录用户设置的一些偏好参数,,此时我们就需要用SharedPreferences和Editor将这些信息保存下来,在下次登录时读取. SharedPreferences保存的数据主要类似于配置信息格式的数据,因此它保存数据的形式为key-value对,下面我们来看下实例代码. 首先是界面布局,比较简单,就是一个普通的登陆界面. 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/r

Android组件系列-----Activity保存状态

本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的时候,突然来了一个电话,这个时候在接听完电话之后我们返回到游戏中,这个时候我们希望游戏还是之前那个进度,或者说发生突发事件,游戏这个应用程序被关闭了,这个时候我们如果再重新打开游戏的话,我们如果还是希望回到之前的进度,我们就需要将其状态保存起来,这样在Activity的摧毁时,我们还能够根据保存的状

Android下用Properties保存程序配置

读写函数分别例如以下: import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public Properties loadConfig(Context context, String file) { Properties properties = new Properties(); try { FileInputStream s = new FileInputSt

Android开发之文件保存读取

Android中文件保存读取可选择在手机本身存储.外存储如SD卡中进行,本文将依次介绍. 1.在手机本身存储保存.读取文件. 布局文件如下:     效果图如下: 在文件名框中填写保存时的文件名,文件内容框填写保存内容,点击保存后即可实现保存至手机本身存储. .java代码如下: MainActivity.java 此处的getApplicationContex()方法(生命周期是整个应用,用MainActivity.this代替时表示获取的是该Activity的上下文,生命周期为该Activi

Android 获取屏幕截图 和保存到本地的sd卡路径下

/** * 获取和保存当前屏幕的截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int w = display.getWidth(); int h = display.getHeight(); Bitmap Bmp = Bi

Android课程---Activity中保存和恢复用户状态

onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chenshuai.excise; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View;