Android心电图动画效果,手把手教你打造一个心电图效果View Android自定义View
大家好,看我像不像蘑菇…因为我在学校呆的发霉了。
思而不学则殆
丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想
,所以革命没成功,同志仍需努力。
好了废话不说了,由于布总要做一个心电图的玩意,所以做来练练手,总之拿到的UI图如下:
做好的效果如下:
拿到图,先做一些简单的分析。呃..
背景表格的绘制
心电图的绘制
背景表格的绘制:
首先drawColor黑色,然后用循环来画线、
心电图的绘制:
看样子是path,应该没问题。
于是就大干一番,按照这俩步骤画完了。。结果发现,嗯。。确实画上去了,关键怎么让他动呢。。 轻而易举想到scrollBy吧。然后你就发现。。背景也跟着变了。。 遇到问题就要解决。。所以这里投机取巧一下 把两个View分离,即背景是一个View,折线图是一个View。
首先,创建一个View,用来做背景View。他有一些属性,因为这些View本来是一个,后来又有一个折现View需要相同的属性,所以索性偷懒改成protected修饰。。
转载请注明出处:http://www.voidcn.com/article/p-thjwmubv-bke.html
public class CardiographView extends View {
//画笔
protected Paint mPaint;
//折现的颜色
protected int mLineColor = Color.parseColor("#76f112");
//网格颜色
protected int mGridColor = Color.parseColor("#1b4200");
//小网格颜色
protected int mSGridColor = Color.parseColor("#092100");
//背景颜色
protected int mBackgroundColor = Color.BLACK;
//自身的大小
protected int mWidth,mHeight;
//网格宽度
protected int mGridWidth = 50;
//小网格的宽度
protected int mSGridWidth = 10;
//心电图折现
protected Path mPath ;
定义了这些属性,在构造器里初始化一下画笔和Path
public CardiographView(Context context) {
this(context,null);
}
public CardiographView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CardiographView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPath = new Path();
}
接下来拿到自身的宽高。注意为了简化例子,这里就不测量了
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mWidth = w;
mHeight = h;
super.onSizeChanged(w, h, oldw, oldh);
}
准备工作都完成,开始绘制背景,创建一个drawBackground(Canvas canvas)方法。
可以想到,用for循环来画横线竖线。横线的起始x坐标都是0,终止x坐标是mWidth, y坐标为i*mGridWidth(网格宽度),我们要拿到网格的个数,即宽高除以网格宽度,具体操作看代码:
private void initBackground(Canvas canvas) {
canvas.drawColor(mBackgroundColor);
//画小网格
//竖线个数
int vSNum = mWidth /mSGridWidth;
//横线个数
int hSNum = mHeight/mSGridWidth;
mPaint.setColor(mSGridColor);
mPaint.setStrokeWidth(2);
//画竖线
for(int i = 0;i
canvas.drawLine(i*mSGridWidth,0,i*mSGridWidth,mHeight,mPaint);
}
//画横线
for(int i = 0;i
canvas.drawLine(0,i*mSGridWidth,mWidth,i*mSGridWidth,mPaint);
}
//竖线个数
int vNum = mWidth / mGridWidth;
//横线个数
int hNum = mHeight / mGridWidth;
mPaint.setColor(mGridColor);
mPaint.setStrokeWidth(2);
//画竖线
for(int i = 0;i
canvas.drawLine(i*mGridWidth,0,i*mGridWidth,mHeight,mPaint);
}
//画横线
for(int i = 0;i
canvas.drawLine(0,i*mGridWidth,mWidth,i*mGridWidth,mPaint);
}
}
现在的运行效果是这样的:
呃。。。看起来像点样子了。。
现在给加上Path吧。。新建一个View,写到相对布局的底部
为了简单起见,新建一个View 继承CardiographView, 这里只需要重写他的ondraw方法即可,其他属性不需要定义。
private void drawPath(Canvas canvas) {
// 重置path
mPath.reset();
//用path模拟一个心电图样式
mPath.moveTo(0,mHeight/2);
int tmp = 0;
for(int i = 0;i<10;i++) {
mPath.lineTo(tmp+20, 100);
mPath.lineTo(tmp+70, mHeight / 2 + 50);
mPath.lineTo(tmp+80, mHeight / 2);
mPath.lineTo(tmp+200, mHeight / 2);
tmp = tmp+200;
}
//设置画笔style
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mLineColor);
mPaint.setStrokeWidth(5);
canvas.drawPath(mPath,mPaint);
}
好了,现在画出来是这样的:
那怎么让他动起来呢。 当然是scrollBy了~~ 这里注意下scrollBy 和scrollTo的区别,面试常考的,之后再postInvalidateDelayed即可
@Override
protected void onDraw(Canvas canvas) {
drawPath(canvas);
scrollBy(1,0);
postInvalidateDelayed(10);
}
大功告成! 这样就和上面的实现图一样了:
当然这只是个demo,你可以根据自己的需求去不同的坐标去绘制,来达到真实的心电图效果。
如果你喜欢我的博客,请点关注哦。。
另外:如果你有职位 只要在广州 欢迎拉我,我刚辞实习工作,六月就要毕业了,即将失业了!!!
本项目地址(求star):点击打开
Android心电图动画效果,手把手教你打造一个心电图效果View Android自定义View相关推荐
- android 自定义心电图,手把手教你打造一个心电图效果View Android自定义View
大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想 ,所以革命没成功,同志仍需努力. 好了废话不 ...
- android 自定义心电图,手把手教你打造一个心电图效果View Android自定义View(示例代码)...
大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想 ,所以革命没成功,同志仍需努力. 好了废话不 ...
- android 广告栏效果,叫教你打造一个滑动悬浮置顶的视觉效果,给你的广告栏增加一些特色...
一个滑动悬浮置顶的View,通过自定义ScrollView来实现一个精美的固定悬浮效果 效果图: 这个特效其实没有那么复杂! 思路: 自定义ListView对头布局进行处理 自定义 RecycleVi ...
- android 手势放缩_手把手教你打造支持手势放大缩小的ImageView
写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过-- ...
- 手把手教你打造一款个人专属Android桌面
实现方式两种 1.从头到尾写一个apk然后把系统的属性加上去,然后启动的时候默认就指定到这个apk的包名,他就启动, 2.我们基于Androidlauncher3的源码去做一个定制化的修改 分析一下这 ...
- android组件化开发视频教程,教你打造一个Android组件化开发框架
作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...
- 手把手教你打造一个企业级实时数据中台【万字图文】
引言--首先来聊聊现代企业数据架构及痛点: 数据孤岛:低效率和利用困难的根源 应用瓶颈:传统方案数据仓库.数据湖的不足 单讲这两个问题你可能会疑惑--为什么会出现这样的问题? 所以下面来讲讲两 ...
- 手把手教你打造一个VIM-IDE
先放上已打造好.可直接使用的VIM-IDE包,懒得一步一步操作配置的可直接下载解压后使用. Ubuntu 64位免安装版VIM-IDE. 压缩包为直接打包/etc/vim配置及插件包 https:// ...
- css加号图标_手把手教你打造一个纯CSS图标库
来,干了这碗安利 写这篇文章的目的其实就是为了安利一下我的图标库: 主题说完了,下面进入正题. 在web开发中,我们经常要用到一些小图标(加减勾叉等).通常做法就两种: 直接使用图片: 使用css/s ...
- PS教程!手把手教你打造一个配色小清新的地图图标
@P大点S微博 :今天的教程是一个小清新风格的定位图标,操作不复杂,重点是图标样式的应用.源文件已打包,来收! PSD源文件 打包下载:http://pan.baidu.com/s/1qWYXqlm ...
最新文章
- python classmethod知识_python基础知识讲解——@classmethod和@staticmethod的作用
- EasyDarwin开源社区 短视频拍摄项目Github地址
- Redis事件管理(三)
- 推荐 | 有三AI生态新的资源干货集中营,好书好工具好内容等你来淘
- Dubbo 只注册,只订阅
- Java并发编程基础-ReentrantLock的机制
- python中的作用域_python 模块的作用域
- 鸡头稳如云台_三轴增稳云台是怎么让相机、手机「稳如鸡头」的?
- 将java.util.Date转换为java.time.LocalDate
- 201521123059 《Java程序设计》第三周学习总结
- [Swift]LeetCode1106. 解析布尔表达式 | Parsing A Boolean Expression
- exp 导数oracle,指数函数 exp(x) 导数的直接求法
- 06-4. How Long Does It Take (25)拓扑排序 求关键路径的最长的长度
- app图标icon大全
- linux查询hba卡命令,如何在Linux/Unix平台查看HBA卡的WWN号
- 入手python时踩过的坑——缩进篇
- 京东2018校园招聘一面、二面
- Java泛型 T extends Serializable
- 带有下标的赋值维度不匹配
- cdn搭建原理_cdn服务器是什么?如何快速部署cdn服务器?
热门文章
- semaphore的几种用法
- 使用Power Query从Web页面获取图像到Power BI报告中
- web工程was部署
- 母函数 经典题目汇总
- JZOJ 4.2 C组 打鼹鼠
- select top 1 oracle,在ORACLE中SELECT TOP N的实现方法
- python爬取方式_selenium+python爬取简书网站的方法
- win10安装wsl2和图形化界面
- Ubuntu 16.04 编译源码并安装 Caffe (CPU only)
- Qt QJsonObject QString QJsonArray 互转