广告
返回顶部
首页 > 资讯 > 移动开发 >Android如何实现动态滚动波形图(心电图)功能
  • 736
分享到

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

2024-04-02 19:04:59 736人浏览 八月长安
摘要

目录一、前言二、效果图三、功能实现四、如何使用一、前言 最近涉及的某个医疗相关的业务,传感器数据传递上来需要实现示波器的效果,心电图的效果,目前交付效果还算理想,于是封装了一下,方便

一、前言

最近涉及的某个医疗相关的业务,传感器数据传递上来需要实现示波器的效果,心电图的效果,目前交付效果还算理想,于是封装了一下,方便自己以后使用,也给大家分享一下

二、效果图

图一是心电图效果,图二是一个滚动的波形图

三、功能实现

(一)绘制背景网格
为了让他看上去像示波器上的数据,我们先绘制一层网格背景,看上去似乎就有那么点意思了

在onLayout函数中获取控件宽高,然后除以默认网格的宽高,得出需要绘制横线和竖线的数量


  
  gridHorizontalNum = (int) (mHeight / GRID_WIDTH);
  gridVerticalNum = (int) (mWidth / GRID_WIDTH);

在onDraw函数中,通过for循环,来一条条绘制横线和竖线


 
 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函数就可以绘制出想要有的效果了


 
 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:id="@+id/wave_view1"
  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:id="@+id/wave_view2"
  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 实现动态滚动波形图(心电图)功能的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android如何实现动态滚动波形图(心电图)功能

本文链接: https://www.lsjlt.com/news/122461.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android如何实现动态滚动波形图(心电图)功能
    目录一、前言二、效果图三、功能实现四、如何使用一、前言 最近涉及的某个医疗相关的业务,传感器数据传递上来需要实现示波器的效果,心电图的效果,目前交付效果还算理想,于是封装了一下,方便...
    99+
    2022-11-12
  • 怎么在Android中实现一个动态滚动波形图
    这期内容当中小编将会给大家带来有关怎么在Android中实现一个动态滚动波形图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。(一)绘制背景网格为了让他看上去像示波器上的数据,我们先绘制一层网格背景,看上去...
    99+
    2023-06-14
  • 怎么在H5中使用canvas实现一个动态图形功能
    怎么在H5中使用canvas实现一个动态图形功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是动画?我们在绘制动画之前必须要弄清楚什么是动画,一个动画最起码需要哪些基...
    99+
    2023-06-09
  • CSS绘制:如何实现简单的动态图形效果
    CSS绘制:如何实现简单的动态图形效果引言:在前端开发中,我们常常需要对网页进行一些动态的图形效果进行美化和交互增强。而CSS绘制是一种简单而强大的方式,可以实现各种各样的动态图形效果。本文将介绍一些常见的简单动态图形效果,并给出具体的代码...
    99+
    2023-11-21
    CSS动画:利用CSS实现动态效果
  • 如何使用Vue实现拖动截图功能
    这篇文章主要介绍了如何使用Vue实现拖动截图功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Vue实现拖动截图功能文章都会有所收获,下面我们一起来看看吧。一、安装html2canvas、vue-cro...
    99+
    2023-07-04
  • JavaScript如何实现图片自动播放功能
    今天小编给大家分享一下JavaScript如何实现图片自动播放功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、自动轮播...
    99+
    2023-07-06
  • android换肤功能 如何动态获取控件中背景图片的资源id?
    这个是在在做一个换肤功能时遇到的问题。   对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.dra...
    99+
    2022-06-06
    图片 背景图 动态 Android
  • js如何实现移动端图片压缩上传功能
    这篇文章给大家分享的是有关js如何实现移动端图片压缩上传功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。移动端图片压缩上传功能如何实现?做移动端开发的时候,form里面的fil...
    99+
    2022-10-19
  • Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)
    作为一个Android新手,想实现手机拍照并上传的功能,经过查找资料,已实现此功能。在此记录备忘。老鸟请忽略。 一、实现思路: 1.Android手机客户端,拍照(或选择图片)...
    99+
    2022-06-06
    选择 图片 动态 Android
  • Html5 Canvas如何实现图片标记、缩放、移动和保存历史状态功能
    这篇文章主要介绍Html5 Canvas如何实现图片标记、缩放、移动和保存历史状态功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果预览动图是放cdn的,如果访问不了,可以登录在线尝试尝试: test.algbb...
    99+
    2023-06-09
  • Android编程如何实现类似天气预报图文字幕垂直滚动效果
    小编给大家分享一下Android编程如何实现类似天气预报图文字幕垂直滚动效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在很多天气或者新闻的应用中,我们都能看到一些字幕滚动的效果,最简单的实现为跑马灯效果,用系统提供的属...
    99+
    2023-05-30
    android
  • 如何在Android应用中实现一个动态界面分享功能
    如何在Android应用中实现一个动态界面分享功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。动态列表界面MomentListFragment支持 下拉刷新与...
    99+
    2023-05-31
    android roi
  • 基于Vue如何实现移动端图片裁剪组件功能
    小编给大家分享一下基于Vue如何实现移动端图片裁剪组件功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!最近项目上要做一个车牌识别的功能。本来以为很简单,只需要将图片扔给后台就可以了,但是...
    99+
    2022-10-19
  • 微信小程序如何实现自定义弹出模态框禁止底部滚动功能
    小编给大家分享一下微信小程序如何实现自定义弹出模态框禁止底部滚动功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!图示:wxml代码:<view class='fi...
    99+
    2022-10-19
  • web开发总移动端如何实现图片上传旋转、压缩功能
    小编给大家分享一下web开发总移动端如何实现图片上传旋转、压缩功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在手机上通过网页...
    99+
    2022-10-19
  • Vue.js 2.0如何实现移动端拍照压缩图片上传预览功能
    小编给大家分享一下Vue.js 2.0如何实现移动端拍照压缩图片上传预览功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在学习...
    99+
    2022-10-19
  • Vue.js 2.0如何实现移动端拍照压缩图片预览及上传功能
    这篇文章主要介绍Vue.js 2.0如何实现移动端拍照压缩图片预览及上传功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先我来讲我实现这个拍照预览压缩上传的思路,准确的说应该是拍...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作