实际演示效果:

Canvas 画图基本步骤:

1、布局添加一个SurfaceView<?xml version="1.0" encoding="utf-8"?>

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">

android:id="@+id/surfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

2、在onCreate()中,加入:

SurfaceHolder surfaceHolder = SurfaceView.getHolder();surfaceHolder = surfaceView.getHolder();//Canvas画图很关键的一步3、Paint设置颜色、线宽、文字大小等属性

penOfGrid.setColor(gridColor); //设置画笔

penOfGrid.setStrokeWidth(1); //线宽

penOfGrid.setAntiAlias(true); //抗锯齿

penOfGrid.setTextSize(24); //文字大小,和线宽无关

penOfData.setColor(lineColor);

penOfData.setStrokeWidth(2);

penOfData.setAntiAlias(true);

penOfData.setTextSize(80);

4、开始画图:

(---坐标的(0,0)的位置是左上角,而不是为人熟知的左下角---)

Canvas canvas = surfaceHolder.lockCanvas();

canvas.drawLine(x1,y1,x2,y2,paint);//画线

canvas.drawColor(Color.BLACK);//画黑色 ...

5、结束画图:

surfaceHolder.unlockAndPost(canvas);

/**

* 绘制数据波形操作,数据缓存到了ArrayList中,本方法将其中数据绘制出来

* 用到的其他未在方法中声明的对象、变量须自己在合适的位置声明

* @param dataGroup 输入数据集合

*/private void drawData(ArrayList dataGroup){

//获得画布的宽高,绘制网格用到

widthOfCanvas = surfaceView.getWidth();

heightOfCanvas = surfaceView.getHeight();

canvas = surfaceHolder.lockCanvas(); // 锁定画布,开始绘图

canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG

| Paint.FILTER_BITMAP_FLAG));//抗锯齿

int xScale = 1; //横轴几个像素为一个单位

//bitmap:用于双缓冲画图,解决刷新闪烁问题

if(bitmap == null){//bitmap == null:第一次画图,bitmap没有初始化,就需要初始化,就是下面这一行

bitmap = Bitmap.createBitmap(widthOfCanvas,heightOfCanvas, Bitmap.Config.ARGB_8888);

Canvas tempCanvas = new Canvas(bitmap);//在bitmap中再新建一个画布Cancas,bitmap相当于SurfaceView了

tempCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG

| Paint.FILTER_BITMAP_FLAG));

tempCanvas.drawColor(backColor); //绘制背景色

/**

* 绘制网格

*/

for (int i = 0; i < widthOfCanvas / 30; i++) {

tempCanvas.drawLine(i * 30, 0, i * 30, heightOfCanvas, penOfGrid); //纵

}

for (int i = 0; i < heightOfCanvas / 30; i++) {

tempCanvas.drawLine(0, i * 30, heightOfCanvas, i * 30, penOfGrid); //横

}

float cx,cy,dx,dy; //画线需要的起点坐标和终点坐标

for (int i = 0;i

//起点:

cx = i * xScale;

cy = heightOfCanvas - heightOfCanvas * dataGroup.get(i)/3;//由于左上角为(0,0),需要对画出来的图进行上下颠倒,

//并根据Canvas高度对数据进行一定比例的放大

//终点:

dx = (i + 1) * xScale;

dy = heightOfCanvas - heightOfCanvas * dataGroup.get(i+1)/3;

//在起点和重点之间画一条线段

tempCanvas.drawLine(cx,cy,dx,dy,penOfData);

}

tempCanvas.drawText("心率:--",20,100,penOfData);

//绘制完毕

canvas.drawBitmap(bitmap,0,0,penOfData);

}else { //如果不是第一次绘制,就没有必要重新初始化bitmap,节约资源,其他操作完全一样

Canvas tempCanvas = new Canvas(bitmap);

tempCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG

| Paint.FILTER_BITMAP_FLAG));

tempCanvas.drawColor(backColor); //Draw background color to Black

/**

* Draw grid

*/

for (int i = 0; i < widthOfCanvas / 30; i++) {

tempCanvas.drawLine(i * 30, 0, i * 30, heightOfCanvas, penOfGrid); //vertical lines

}

for (int i = 0; i < heightOfCanvas / 30; i++) {

tempCanvas.drawLine(0, i * 30, heightOfCanvas, i * 30, penOfGrid);

}

float cx,cy,dx,dy;

for (int i = 0;i

cx = i * xScale;

cy = heightOfCanvas - heightOfCanvas * dataGroup.get(i)/3;

dx = (i + 1) * xScale;

dy = heightOfCanvas - heightOfCanvas * dataGroup.get(i+1)/3;

tempCanvas.drawLine(cx,cy,dx,dy,penOfData);

}

tempCanvas.drawText("心率:"+falseHeart(),20,100,penOfData);

canvas.drawBitmap(bitmap,0,0,penOfData);

}

//将双缓冲的图复制到SurfaceView上显示

surfaceHolder.unlockCanvasAndPost(canvas);

}

Android心电数据分析,Android SurfaceView+Canvas画脉搏/心电数据图-Go语言中文社区相关推荐

  1. 拼写检查工具是android,Android的文本和输入---拼写检查器(一)-Go语言中文社区...

    Android平台提供能够让你在应用程序中执行和访问拼写检查的拼写检查器框架.这个框架是由Android平台提供的文本服务API之一. 要在应用程序中使用该框架,你就要创建一个特殊的Android服务 ...

  2. 荣耀5a android go,vue项目解决android版本过低引起兼容问题(例如华为荣耀6)-Go语言中文社区...

    问题描述: 在项目中发现在华为荣耀6手机上,出现页面白屏,抓包后显示接口调用并没有执行,查找后认为是android版本过低(升级测试android4.4.2已是华为荣耀6的最新系统). 华为荣耀6:a ...

  3. android go rom下载地址,一步一步学Android ROM开发(一)——修改现有ROM资源文件-Go语言中文社区...

    一,准备工作 1.一台开发手机. 我推荐最好用G7,也是就HTC Desire那款(是不是有些广告嫌疑...),这台机各种ROM都很全,资料也多些,很容易刷到root,android版本也是最新的2. ...

  4. vue开发android tv,h5做APP TV(电视端APP vue框架)-Go语言中文社区

    先px转rem,然后把psd上传蓝湖,把尺寸改为750的图纸,按照上面的尺寸来写代码 1.安装px2rem-loader npm install px2rem-loader 2.配置px2rem-lo ...

  5. python画聚类图、并且把聚类图保存起来_Python利用igraph绘制复杂网络聚类(社区检测)结果图-Go语言中文社区...

    前言:研究生期间主要做复杂网络聚类,也称为社区检测.临毕业前,老师让之前发表的论文里的算法代码C化,并写出界面进行可视化.由于之前虽然做过可视化,但基本上都是将聚类结果导入到pajek或者gephi这 ...

  6. android 照片拼接长图_android多图拼接长图并合理显示-Go语言中文社区

    以前说过了 重叠部分图片合成,今天说一下canvas.drawBitmap拼接长图 先上效果gif 需求:多图拼接长图,长图大小 宽度为屏幕,高度自己不变形成比例 核心源码1.:final int m ...

  7. 管理学生信息android,Android 学生信息管理系统-Go语言中文社区

    android:layout_width="fill_parent"android:layout_height="wrap_content"android:gr ...

  8. java adt简单开发,android java开发 第一天 之熟悉eclipse adt-Go语言中文社区

    1.下载并安装好android-sdk后(android-sdk里包含了android 1.6 ~ android4.0的所有api,支持各种版本的android) 2.下载adt(android d ...

  9. android go怎么安装,Android studio3.0安装教程-Go语言中文社区

    Android studio是目前开发Android主流的软件 但是因为被墙缘故 ,导致很多人一直refreshiing gradle project 或者其他安装问题 网上虽然有很多解决方法,但是大 ...

最新文章

  1. SQL Server 2016 查询存储性能优化小结
  2. ThreadPoolExecutor使用错误导致死锁
  3. Gabor滤波小结整理
  4. 同时tar解压多个文件
  5. [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法
  6. MAX13085E/MAX485 _中文翻译
  7. [置顶]LGame框架问题汇总,有疑问请发至此文
  8. T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他(看了两次了,转了)
  9. 随想录(被高估的busybox)
  10. box2D斜面摩擦力和sprite朝向的兼顾取舍
  11. 书籍:Learn Web Development with Python - 2018.pdf
  12. win10系统无法登录ftp服务器失败,win10电脑下ftp连接失败怎么解决
  13. 多元统计分析--判别(距离判别、Fisher判别、Bayes判别)
  14. hihoCoder 1096 Divided Product 微软苏州校招笔试 12月27日
  15. 使用Map集合来做一个不同姓氏人数的统计 有一个String数组保存着10个人的姓名{“张三“,“李四“,“王二“...} 通过程序设计,把不同姓氏的姓氏和人数保存到Map集合中
  16. 京东app秒杀接口sk参数分析
  17. Ubuntu查找软件命令
  18. tiktok设备注册+xg xk xl xa签名
  19. 美国首例!Autopilot事故致2人死亡 特斯拉车主被控过失杀人
  20. Java使用华软通信能力平台实现短信发送

热门文章

  1. 【Python】一些容易忽略的知识点
  2. tensorflow tfrecoder read write
  3. react-json渲染
  4. Xshell报错“The remote SSH server rejected X11 forwarding request.”
  5. 微信小程序开发之普通链接二维码
  6. C# File类的操作
  7. Codeforces Gym101518H:No Smoking, Please(最小割)
  8. [转]ClassPath是什么
  9. Photoshop 通道
  10. Robocode教程2——你的第一个robo,取个好名字哦