最近在项目中需要使用到的心电Ecg显示效果,本来打算使用sdk方的视图组件的,但是奈何他们的组件问题太多了。比如网格不对齐(强迫症表示这个无法忍),组件不支持静态显示数据等等问题。所以打算自己写一个用来做主页面的心电数据展示。

首先要实现以下几个功能点:

1.网格的大小,颜色可控。

2.心电线条的颜色粗细可控。

3.无论传入的数据源长度是多少,都要均匀的显示在表格上(按一定的比例尺缩放或者扩展)

之后可能会实现动态显示数据的部分,会在本篇博客更新。

技术实现要点:

传入的数据源是String字符串,类似于:"0.101253886148333549,0.001253886148333549,0.003036087844520807,0.002440808573737741"

这样的数据,所以这里要对传入的数据进行处理,根据数据的个数确定屏幕上一共要均匀连线多少个点。

代码实现:


class EcgShowView : View {private var mWidth: Float = 0.toFloat()private var mHeight: Float = 0.toFloat()private var paint: Paint? = nullprivate var path: Path? = nullprivate var dataStrList: Array<String>? = nullprivate var intervalNumHeart: Int = 0private var intervalRowHeart: Float = 0.toFloat()private var intervalColumnHeart: Float = 0.toFloat()private var data: FloatArray? = nullprivate var mHeartLinestrokeWidth: Float = 0.toFloat()private var row: Int = 0private var intervalRow: Float = 0.toFloat()private var column: Int = 0private var intervalColumn: Float = 0.toFloat()private var mGridLinestrokeWidth: Float = 0.toFloat()private var mGridstrokeWidthAndHeight: Float = 0.toFloat()//心电private val MAX_VALUE = 20f //峰值private val HEART_LINE_STROKE_WIDTH = 5f//网格private val GRID_LINE_STROKE_WIDTH = 3fprivate val GRID_WIDTH_AND_HEIGHT = 10fconstructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {init()}private fun init() {paint = Paint()path = Path()//setLayerType(View.LAYER_TYPE_SOFTWARE, null);}constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {super.onLayout(changed, left, top, right, bottom)mWidth = measuredWidth.toFloat()mHeight = measuredHeight.toFloat()mGridLinestrokeWidth = dip2px(GRID_LINE_STROKE_WIDTH).toFloat()mGridstrokeWidthAndHeight = dip2px(GRID_WIDTH_AND_HEIGHT).toFloat()column = (mWidth / mGridstrokeWidthAndHeight).toInt();intervalColumn = mWidth / columnrow = (mHeight / mGridstrokeWidthAndHeight).toInt()intervalRow = mHeight / rowmHeartLinestrokeWidth = dip2px(HEART_LINE_STROKE_WIDTH).toFloat()initData()}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)//绘制网格paint!!.style = Paint.Style.STROKEpaint!!.color = Color.parseColor("#D8D8D8")paint!!.strokeWidth = mGridLinestrokeWidthpaint!!.isAntiAlias = truefor (i in 0..column) {val iTempC = i * intervalColumnpath!!.moveTo(iTempC, 0f)path!!.lineTo(iTempC, mHeight)}for (i in 0..row) {path!!.moveTo(0f, i * intervalRow)path!!.lineTo(mWidth, i * intervalRow)}canvas.drawPath(path!!, paint!!)//绘制心电图if (data == null || data!!.size == 0) {return}paint!!.reset()path!!.reset()paint!!.style = Paint.Style.STROKEpaint!!.color = Color.parseColor("#31CE32")paint!!.strokeWidth = mGridLinestrokeWidthpaint!!.isAntiAlias = truepath!!.moveTo(0f, mHeight / 2)var nowX: Floatvar nowY: Floatfor (i in data!!.indices) {nowX = i * intervalRowHeartvar dataValue = data!![i]if (dataValue > 0) {if (dataValue > MAX_VALUE * 0.8f) {dataValue = MAX_VALUE * 0.8f}} else {if (dataValue < -MAX_VALUE * 0.8f) {dataValue = -(MAX_VALUE * 0.8f)}}nowY = mHeight / 2 - dataValue * intervalColumnHeartpath!!.lineTo(nowX, nowY)}canvas.drawPath(path!!, paint!!)}fun setData(dataStr: String) {dataStrList = dataStr.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()initData()}private fun initData() {try {var dataLength = dataStrList!!.sizeif (dataLength > mWidth) {dataLength = mWidth.toInt()}data = FloatArray(dataLength)for (i in 0 until dataLength) {data!![i] = java.lang.Float.parseFloat(dataStrList!![i])}intervalNumHeart = data!!.sizeintervalRowHeart = mWidth / intervalNumHeartintervalColumnHeart = mHeight / (MAX_VALUE * 2)} catch (e: Exception) {e.printStackTrace()}}private fun px2dip(px: Int): Int {val scale = context.resources.displayMetrics.densityreturn (px / scale + 0.5f).toInt()}private fun dip2px(dipValue: Float): Int {val scale = context.resources.displayMetrics.densityreturn (dipValue * scale + 0.5f).toInt()}}

Github项目地址:

https://github.com/jiangzhengnan/UI

最近会把实现的UI效果都集中到一个库里面,求start~

Android——ECG心电图的绘制实现相关推荐

  1. Android心电数据分析,Android 根据心电图(ECG)数据分析绘制心电图

    Android 根据心电图(ECG)数据分析(瞎猜)绘制样子差不多的心电图 项目中用到心电图分析,使用某仪器测量后得到的心电图数据,分析后放到android项目中,对数据不是很了解,所以只能是解读个大 ...

  2. Android studio画心电图,android 开发 心电图绘制

    从接触android蓝牙开发到现在已两月有余,将自己一个个小小的知识点积攒起来,以便日后查阅.android蓝牙项目开发基本已完毕,抽点时间整理一下,先把今天解决的问题呈上,以后再记录蓝牙开发相关的知 ...

  3. android 开发 心电图绘制

    从接触android蓝牙开发到现在已两月有余,将自己一个个小小的知识点积攒起来,以便日后查阅.android蓝牙项目开发基本已完毕,抽点时间整理一下,先把今天解决的问题呈上,以后再记录蓝牙开发相关的知 ...

  4. android 自定义心电图,手把手教你打造一个心电图效果View Android自定义View

    大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想 ,所以革命没成功,同志仍需努力. 好了废话不 ...

  5. android 自定义心电图,手把手教你打造一个心电图效果View Android自定义View(示例代码)...

    大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想 ,所以革命没成功,同志仍需努力. 好了废话不 ...

  6. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  7. Android刷新机制-View绘制原理

    Android刷新机制-View绘制原理 Android刷新机制-SurfaceFlinger原理 Android刷新机制-Choreographer原理 一.概述 本文将从startActivity ...

  8. Android O: View的绘制流程(二):测量

    在前一篇博客Android O: View的绘制流程(一): 创建和加载中,  我们分析了系统创建和加载View的过程,这部分内容完成了View绘制的前置工作. 本文开始分析View的测量的流程. 一 ...

  9. Android O: View的绘制流程(三):布局和绘制

    前一篇文章Android O: View的绘制流程(二):测量中,  我们分析了View的测量流程.  当View测量完毕后,就要开始进行布局和绘制相关的工作,  本篇文章就来分析下这部分流程. 一. ...

  10. android高德地图多个mark点击,Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗...

    最近开发中,遇到一个多个点绘制,并实现点击事件,出现自定义窗口显示相关信息等功能,所以写了这篇博客. 从后台请求数据,得到多个经纬度,然后绘制在地图上,并实现点击,出现相关信息(自定义弹框实现) 先来 ...

最新文章

  1. 计算机改变了我们的生活英语作文带翻译,一件事改变了我的生活的英语作文,带翻译,求帮忙,最好是符合初中三年级的英语作文...
  2. MySQL中的子查询
  3. Delphi与SQL模糊查询(转载)
  4. 娄底二中高考2021成绩查询,2021年娄底高考状元名单公布,娄底高考状元学校资料及最高分...
  5. C#多线程之旅(七)——终止线程
  6. LeetCode 2125. 银行中的激光束数量
  7. 训练过程acc_AI 深度学习训练tricks总结(均有实验支撑)
  8. python合并数组输出重复项_python进行数组合并的方法
  9. 万字详解Lambda、Stream和日期
  10. C++工程师面试题大全
  11. html5善于盒模型定位,2个小时上手html+css-003盒模型和定位
  12. 转 docker 部署 kafka
  13. 每天CookBook之Python-003
  14. 关于H264相关的EBSP,RBSP,SODP的说明
  15. IP子网划分的原理及应用
  16. linux recv函数 参数,linux send recv函数详解
  17. DOE全因子实验设计报告
  18. ATFX:美国7月CPI前瞻,及美元指数走势判断
  19. 原生JS实现中文简繁切换,引入即可整站变繁体
  20. My Seventeenth Page - 赎金信 - By Nicolas

热门文章

  1. Exploring Pre-trained Language Models for Event Extraction and Generation 论文阅读
  2. 中职学校计算机教学参考文献,中职计算机教学论文
  3. 怎么用磁盘压缩卷新建分区
  4. 语言-汉语-官话-中原官话:中原官话
  5. 论文专题笔记:part segmentation
  6. 深入浅出HashMap
  7. linux中如何修改只读文件
  8. React-Native笔记--Debugger and device times had drifted by more than 60s.
  9. 直播回顾 |「星轨巡讲」技术分享会亮点速递
  10. unity物体自身轴旋转_Unity 中物体的旋转