我正在为 Android 使用 aChartEngine 的 0.7.0 图表库。我有一个工作 XY 图表,当收到新数据时,它大约每秒动态变化。但是,它从左到右绘制折线图并最终移出视图。查看正在绘制的新数据的唯一方法是向右滚动图表视图。
有谁知道如何让这条线在左侧绘制新数据,以便旧数据最终滚动到视图之外。基本上,反转图表线的方向?
我正在为 Android 使用 aChartEngine 的 0.7.0 图表库。我有一个工作 XY 图表,当收到新数据时,它大约每秒动态变化。但是,它从左到右绘制折线图并最终移出视图。查看正在绘制的新数据的唯一方法是向右滚动图表视图。
有谁知道如何让这条线在左侧绘制新数据,以便旧数据最终滚动到视图之外。基本上,反转图表线的方向?
我的代码:
private XYMultipleSeriesDataset HRDataset = new XYMultipleSeriesDataset();
private XYMultipleSeriesRenderer HeartRateRenderer = new XYMultipleSeriesRenderer();
private XYSeries HRCurrentSeries;
private GraphicalView HRChartView;
在 onResume() 中:
if (HRChartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.HRchart);
HRChartView = ChartFactory.getLineChartView(this, HRDataset, HeartRateRenderer);
layout.addView(HRChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
// boolean enabled = HRDataset.getSeriesCount() > 0;
// setSeriesEnabled(enabled);
} else {
HRChartView.repaint();
}
在 onCreate() 中:
HeartRateRenderer.setAxisTitleTextSize(16);
HeartRateRenderer.setChartTitleTextSize(20);
HeartRateRenderer.setLabelsTextSize(15);
HeartRateRenderer.setLegendTextSize(15);
HeartRateRenderer.setMargins(new int[] {20, 30, 15, 0});
HeartRateRenderer.setAxesColor(Color.YELLOW);
String seriesTitle = "Heart Rate";
XYSeries series = new XYSeries(seriesTitle);
HRDataset.addSeries(series);
HRCurrentSeries = series;
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.RED);
HeartRateRenderer.addSeriesRenderer(renderer);
我有一项从蓝牙设备接收数据的服务。当新数据到达时,我调用这个函数:
public void setupHRChart(double x, double y)
{
HRCurrentSeries.add(x, y);
if (HRChartView != null) {
HRChartView.repaint();
}
}
在清单中:
<activity android:name="org.achartengine.GraphicalActivity" />
在我的布局中:
<LinearLayout android:id="@+id/HRchart" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="300px" android:layout_weight="1" />
- 希望有帮助。
我实际上决定采用 aChartEngine 的动态折线图的自然流动方向。我能够锁定图形图像,这样线条就不会再从屏幕上滚出。我还从系列的开头删除了项目,以保持一定的时间跨度可见,而不会将图形压缩成大量线条。它实际上工作得很好。
这是一个演示图表的 youtube 视频:http ://www.youtube.com/watch?v=mZMrOc5QaG0
我还从系列的开头删除了项目以保持一定的时间跨度可见
这个解决方案的问题是你实际上丢失了数据......
如何使用渲染器的 setXAxisMax 和 setXAxisMin 如下:
0) 将 XAxisMax 设置为一个值,例如 10 并将 XAxisMin 值设置为 0
1) 计算 xTick 变量中的“刻度”
2) 一旦 xTick > XAxisMax:
2.1) 将 XAxisMax 设置为 xTick
2.2) 将 XAxisMin 设置为 + 1
3)再次渲染图表
这样我们实际上移动了图表的“可见部分”(通过使用 Xmin 和 Xmax)但不会丢失任何数据(即,我们仍然可以滚动查看以前的数据点):
renderer.setXAxisMin(0.0);
renderer.setXAxisMax(10);
xTick = 0;
lastMinX = 0;
private void refreshChart(double lastValue) {
/* check if we need to shift the x axis */
if (xTick > getRenderer().getXAxisMax()) {
getRenderer().setXAxisMax(xTick);
getRenderer().setXAxisMin(++lastMinX);
}
series.add(xTick++, lastValue);
mChartView.repaint();
}