心电波形图EcgView

在这里插入图片描述

前言:

心电图是被记录在布满大小方格的纸上,所以想要知道心电图怎么看,首要的是知道这些格子代表的意义。这些方格中每一条细竖线相隔1mm,每一条细横线也是相隔1mm,它们围成了1mm见方的小格。粗线是每五个小格一条,每条粗线之间相隔就是5mm,横竖粗线又构成了大方格。

心电图记录纸是按照国际规定的标准速度移动的,移动速度为25mm/s,也就是说横向的每个小细格代表0.04s;每两条粗线之间的距离就是代表0.2s。

国际上对记录心电图时的外加电压也是有规定的,即外加1mV电压时,基线就应该准确地抬高10个小格,也就是说,每个小横格表示0.1mV,而每个大格就表示0.5mV,每两个大格就代表了这1mV。

特点:

  • 走纸速度固定:25mm/s
  • 一屏显示的数据量不确定;
  • 以下采用的是心电(ECG)的知识,填充的是心音(PCG)的数据,所以采样率是8000;

1、Android实现:

网格图:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;


public class GridView extends View {
   
   
    private int width, height;
    private int row = 5;
    private Paint paint;

    public GridView(Context context) {
   
   
        this(context, null);
    }

    public GridView(Context context, AttributeSet attrs) {
   
   
        this(context, attrs, 0);
    }

    public GridView(Context context, AttributeSet attrs, int defStyleAttr) {
   
   
        super(context, attrs, defStyleAttr);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
    }

    
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
   
   
//        super.onLayout(changed, left, top, right, bottom);
        width = getWidth();
        height = getHeight();
    }

    
    protected void onDraw(Canvas canvas) {
   
   
//        super.onDraw(canvas);
        paint.setStrokeWidth(2);
        drawGird(canvas, row * 5, Color.parseColor("#D7D7D7"));
        paint.setStrokeWidth(4);
        drawGird(canvas, row, Color.parseColor("#D7D7D7"));
    }

    private void drawGird(Canvas canvas, int cols, int color) {
   
   
        paint.setColor(color);
        float rowSpace = height * 1f / cols;
        //画竖线
        for (int i = 0; i * rowSpace <= width; i++) {
   
   
            canvas.drawLine(i * rowSpace, 0, i * rowSpace, height, paint);
        }
        //画横线
        for (int i = 0; i <= cols; i++) {
   
   
            canvas.drawLine(0, i * rowSpace, width, i * rowSpace, paint);
        }
    }
//    @Override
//    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
   
   
//        super.onSizeChanged(w, h, oldw, oldh);
//        width = w;
//        height = h;
//        invalidate();
//    }
}

波形图:

package com.kl.analyze.view.wave;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;

import com.kl.common.base.BaseApp;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class AudioWaveView extends SurfaceView implements Callback, Runnable, Serializable {
   
   
    private final List<Short> pointList = Collections.synchronizedList(new LinkedList<>());
    private Paint mPaint;
    private SurfaceHolder mHolder;
    private int mWidth = 0;
    private int mCenterY = 0;
    //网格颜色
    protected int mWaveColor = com.kl.common.R.color.colorPrimary;
    public float[] points;
    private boolean isRunning = false;
    private boolean isDraw = false;
    List<Short> nativeDatas = null;
    volatile ThreadPoolExecutor singleThreadExecutor;//单线程池
    private double zoom;//每一毫米所占像素(mm/px)
    private float gapX = 0.2f;// x轴每个点所占的像素(px)
    private int xSize = 0;// x轴能绘制的点的数量
    private final int FILTER_SIZE = 50;//采样率太高,数据抽稀

    
    public void run() {
   
   
        while (isRunning) {
   
   
            if (isDraw) {
   
   
                drawFrame();
            } else {
   
   
                Thread.yield();
            }
        }
    }

    public void addWaveData(short[] waveDataArray) {
   
   
        if (!isRunning || waveDataArray == null) {
   
   
            return;
        }
        if (nativeDatas == null) {
   
   
            nativeDatas = new ArrayList<>();
        }

        for (short waveData : waveDataArray)<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值