热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android如何实现动态滚动波形图(心电图)功能

这篇文章主要介绍了Android如何实现动态滚动波形图(心电图)功能,帮助大家更好的理解和学习使用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 

网格是静态的,所以绘制起来比较简单

(二)绘制折线

折线的绘制有两种模式,也就是效果图上下两种效果的区别

原理也比较简单

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  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' }
  }
 }

(二)布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

 

 

 

xml中可使用的参数

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   
   
  
 

(三)向波形图中添加数据

    data = new Random().nextFloat()*(20f)-10f;
    waveShowView.showLine(data);//取得是-10到10间的浮点数

源码地址:

https://github.com/Giftedcat/Waveform

到这里就结束啦.

以上就是Android如何实现动态滚动波形图(心电图)功能的详细内容,更多关于Android 实现动态滚动波形图(心电图)功能的资料请关注其它相关文章!


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
author-avatar
rwp4677210
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有