以前的一篇文章介绍了hellocharts这个开源库的基本的使用方法(传送门:https://juejin.im/post/5a3d38f451882533f01ec4d8 ) ,今天,基于hellocharts咱们来实现一个相似心电图的动态曲线的效果,先上效果图:git
Viewportgithub
首先,开始代码前咱们先来认识一下hellocharts重要的一个概念-Viewport,翻译咱们能够知道,Viewport是视图,窗口的意思,在hellocharts中,一个Viewport由left,top,right,bottom四个点组成,能够当作是一个矩形范围。bash
模拟需求dom
假设,咱们如今手机链接着一个硬件设备,每隔300ms,硬件就会传过来一条数据,要求客户以曲线的形式动态显示(如上面的效果图)。那么这个需求用hellocharts怎么实现呢?咱们刚刚已经了解了Viewport,那么咱们可不能够这样作呢:根据已有数据动态更新Viewport,造成曲线动态向左移动的效果。ide
代码实现post
基本的代码基于上一遍文章的介绍,这里主要增长了一个定时器来不断增长数据,更新当前Viewport的显示。ui
timer.schedule(new TimerTask() {
@Override
public void run() {
//实时添加新的点
PointValue value1 = new PointValue(position * 5, random.nextInt(100) + 40);
value1.setLabel("00:00");
pointValueList.add(value1);
float x = value1.getX();
//根据新的点的集合画出新的线
Line line = new Line(pointValueList);
line.setColor(Color.RED);
line.setShape(ValueShape.CIRCLE);
line.setCubic(true);//曲线是否平滑,便是曲线仍是折线linesList.clear();
linesList.add(line);
lineChartData = initDatas(linesList);
lineChartView.setLineChartData(lineChartData);
//根据点的横坐实时变幻坐标的视图范围
Viewport port;
if (x > 50) {
port = initViewPort(x - 50, x);
} else {
port = initViewPort(0, 50);
}
lineChartView.setCurrentViewport(port);//当前窗口
Viewport maPort = initMaxViewPort(x);
lineChartView.setMaximumViewport(maPort);//最大窗口
position++;
}
}, 300, 300);
复制代码
/**
* 当前显示区域
* @param left
* @param right
* @return
*
/
private Viewport initViewPort(float left, float right) {
Viewport port = new Viewport();
port.top = 150;
port.bottom = 0;
port.left = left;
port.right = right;
return port;
}
/**
* 最大显示区域
* @param right
* @return
*
/
private Viewport initMaxViewPort(float right) {
Viewport port = new Viewport();
port.top = 150;
port.bottom = 0;
port.left = 0;
port.right = right + 50;
return port;
}
复制代码
完整代码地址:https://github.com/SolveBugs/HelloChartDemospa