一、写在前面的话
最近朋友找帮忙,需要绘制心率波形,要细腻流畅。于是研究了一下,于是就有了这篇文章。本文主要讲一下笔者的思路,控件不是实现的很好,后面有时间再打磨。主要是笔者觉得这个过程挺有意思的,就想和大家分享一下。目前的效果就像上面那样,因为手机录屏录出来掉帧太严重,就录了个视频做了张gif图,实际上面的很丝滑,下面的效果不是很理想,具体原因后面会介绍。
二、心率线的绘制思路
1、线要平滑,要有曲率,还有向左平移。
这里我用三阶贝塞尔曲线来画,其实二阶也可以,但是我以前的项目画的是三阶的,所以就直接搬过来用了,偷个懒,哈哈。
//实际点的集合
private List<PointF> mPointList;
//控制点的集合
private List<PointF> mControlPointList;
private void drawLine(Canvas canvas) {
linePath.reset();
mPointList.clear();
mControlPointList.clear();
linePath.moveTo(0, 0);
int offset = w / maxSize;
int allY = high - low;
if (allY == 0) {
return;
}
for (int i = 0; i < data.size(); i++) {
mPointList.add(new PointF(i * offset, h * (data.get(i) - low) / allY));
if (mPointList.get(i).y < top) {
mPointList.get(i).y = top;
}
}
//初始化控制点
if (mPointList.size() < 2) {
return;
}
for (int i = 0; i < mPointList.size(); i++) {
if (i == 0) {
//第一个点
PointF nextPoint = mPointList.get(i + 1);