先上个效果图(画块饼),让你有耐心看完下面内容。

这里写图片描述

网上已经有不少人,把类似的效果做出来了。我就把自己做出这个效果的思路写出来,希望对想对自定义 View 有更深理解的朋友有帮助。

先作一个草图,打开 Windows 自带的“画图”软件,OS X 系统的就找个类似的软件吧。先想好,再来画个草图。我画的草图如下:

这里写图片描述

看到这,可能有人有疑问了,写自定义 View 怎么不写代码啊,我是来看代码的,最好把完整代码贴出来,画这些图有 * 用啊。有的高手能够在脑海里把很复杂的自定义 View 想象出来。为了说服你最好画一画图,我在这里简单说几句,个人认为画图是个重要的步骤,能事半功倍。想法是代码的灵魂,先想好想法,再去写代码就容易了,类似于“胸中有文章,下笔如涌泉”。假如你是新手阶段,对着别人的代码敲可以有进步,但如果你一直都是对着别人的代码敲然后敲成一个项目的,你自己深想一下,有没有前途?画了图之后,你的思维就被解放了,不会深陷于文字之中,还可能激发出新的想法,你就会想办法实现它。如果你没尝试过的话,可以试一试,顶多就是半个小时的时间,如果你有特别深刻的体验,那恭喜你学会了一种新方式;如果没有,你只是进行了一次风险不大的尝试,人生的惊喜就在于新的尝试。

看着你画的草图,我们可以看到屏幕宽度是已知的,设置大格子的数目后,大格子的宽度也就确定了。这个时候有思绪了,需要横纵两个方向的格子数量。来设置两个全局变量:

这里写图片描述

horizontalBigGirdNum 为横向的线,即纵向大格子的数量。verticalBigGirdNum 为纵向的线,即横向大格子的数量。

在 XML 文件中使用:

这里写图片描述

在 xml 中宽 360 dp( match_parent ),高 270 dp,也就是 3 : 4 的关系。

horizontalBigGirdNum = 6,verticalBigGirdNum = 8,横向八个格子,纵向六个格子,这样划分比较科学。

正式开始写代码。首先初始化画笔。

这里写图片描述

在 onSizeChanged() 方法调用后,View 的宽高也就确定了。我们可以在这个方法里面来确定每个大格子的宽度。

这里写图片描述

在 onDraw() 方法中进行绘画。

将画网格写在一个方法中,并设置标志位,这样可以设置一个 public 方法来设置是否画网格。

这里写图片描述

画网格的方法:

这里写图片描述

到这里,网格就出来了。

接下来就是重点,画心电图了。

画草图。

这里写图片描述

分析:一条这样的线我们可以用 Path 类来画,画笔 Paint的类型记得设为 Paint.Style.STROKE(不然会很难看)。

这里写图片描述

没有数据是出不了效果的,我们来生成一些模拟的数据。

这里写图片描述

如果你需要将真实的心电图数据(比如说从传感器通过蓝牙传送过来的)放进来的话,只要设置一个 public 方法从外面传参数进来就好了。

到了这里,轨迹就能画出来了。但是,它不能像真实心电图那样将心电轨迹慢慢呈现出来,而是一下子就显示出来了。

我们可以加个延时,将心电图的点一个一个慢慢地连接起来。让我来做个比喻。我们都玩过贪吃蛇的游戏,每个蛇要吃的点就是数据源的坐标,没加延时情况下,贪吃蛇的速度很快,我们一眨眼的瞬间它就吃完了,我们就马上看到了整体曲线,而加了延时后,贪吃蛇的速度就慢了,它慢慢地经过点然后吃掉变长,我们也就看到了轨迹形成的过程。

代码实现如下:

这里写图片描述

增加延时,并且使上面的代码持续地执行。

这里写图片描述

项目代码:

完整代码

(用 AS 的话太大了,还是用 Eclipse 的项目吧)

到此,心电图就基本完成了。这只是一个简单的绘画,要想做的更好,还有许多事情要做,比如说封装入库等。如果你是一个想练习自定义 View 的初学者,我想这篇文章会对你有所启发。

android 自定义心电图,Android自定义 View 练习 —— 心电图的绘制相关推荐

  1. android 自定义心电图,Android动态滚动波形图(心电图)的实现

    一.前言 2021年的第一天,这也是我今年发布的第一篇博客,为了达成在元旦当天发布博客的成就,在大家欢庆元旦的时候,我忙忙碌碌的写了一整天的代码,祝愿自己新的一年,一帆风顺,牛气冲天 说远了,聊一下今 ...

  2. android 自定义心电图,Android如何实现动态滚动波形图(心电图)功能

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

  3. android炫酷的自定义view,Android自定义View实现炫酷进度条

    本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...

  4. android组件什么时候加载到r文件,Android自定义加载loading view动画组件

    我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontr ...

  5. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  6. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  7. Android Paint应用之自定义View实现进度条控件

    在上一篇文章<Android神笔之Paint>学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 上图就是本文要 ...

  8. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  9. Android开发-将自定义View布局到Layout中并调用

    写程序的时候,关于布局方面遇到并解决的问题 1.自定义View及其layout属性. 自定义View: [java] view plaincopy public class DrawView exte ...

  10. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

    转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己 ...

最新文章

  1. C#编程规范--控件命名篇[转]
  2. 剪切粘贴时总是上次的内容_Quicker 1.4版本更新内容
  3. 开源之旅之开源企业软件采购指南
  4. 统计订单:复选+全选+计算 的列表
  5. python用正方形画圆_Python 用turtle实现用正方形画圆的例子
  6. 万能电子狗升级工具_HUD抬头显示,车萝卜再推新品,屏幕全新升级
  7. 什么是通讯作者?和第一作者的区别有哪些?
  8. 【车间调度】基于matlab粒子群算法求解生产调度问题【含Matlab源码 485期】
  9. OpenCV cv.INTER_AREA和cv.INTER_CUBIC 还有cv.INTER_LINEAR
  10. javascript 高级程序设计 (第四版) 第二章 下
  11. GDB调试 ORBSLAM3
  12. EAUML日拱一卒-活动图::活动分区
  13. 短视频的素材在哪里找呢?推荐给你一个好办法
  14. node.js+puppeteer创建定时任务自动登录网站截取图片
  15. 雅俗共享的微信小程序《老子探秘》,大家评价一下好坏
  16. web前端 | 一条“不归路” - 学习路线
  17. 反应动力学参数拟合与停留时间分布函数——基于Python实现
  18. 怎么把excel文件转成dta_如何将excel表格数据转化为dta格式-怎么把dat文件转换成Excel文件,里面的数据格式要......
  19. PortTunnel端口转发
  20. 数字电路31(已知状态图设计同步时序电路)

热门文章

  1. MySQL(16)-----字符串函数
  2. Java基础(五):多线程
  3. c#使用类库nthereum在.net上开发以太坊的实战示例
  4. HDU3853:LOOPS
  5. two day python基础知识
  6. 游戏中按概率播放某个音效简单c++实现
  7. java future 设计模式_转多线程设计模式 - Future模式之JAVA原生实现
  8. Java数据类型占用内存最多的_java基础数据类型的内存占用
  9. docker 常用操作-push分享及下载
  10. Flask实现REST API之接收POST和GET请求