如何在android中绘制实时数据?

时间:2012-10-15 05:08:45

标签: android charts

我正在设计一个Android应用程序,我想绘制通过蓝牙接收的实时数据。 我收到一个信号并处理它以获得一些结果,我想实时显示它。我看到有各种用于绘制图表的android库。我对使用一个这样的库或使用Javascript感到有点困惑。任何人都可以建议哪一个更好的选择吗?还有,哪个Android库可以使用?

4 个答案:

答案 0 :(得分:4)

Android有许多图表库,但每次我有一个要求时,我使用2D graphics使用了android原生Canvas框架。我从来没有寻找其他选择。它很简单,你有很多控制权。好吧,只是告知..

答案 1 :(得分:2)

最好将flot-android-chart用于不同类型的图表创建。

或者您只需使用achartengine

即可

如果你想尝试创建没有任何内置jar的图表,只需看看Bar Chart in Android With out any Built in jars(但它只是条形图)

答案 2 :(得分:1)

如果您想要Android的实时图表,那么fastest Android Chart库目前为SciChart

有一篇performance comparison文章在实时条件下将5个开源和商业图表放在首位,在所有测试中,SciChart排在首位,有时甚至相当大!

enter image description here

这使得SciChart适用于real-time trading appsmedical appsscientific apps,甚至适用于将Android作为操作系统运行的嵌入式系统。

披露:我是SciChart项目的技术主管,只是你知道!

答案 3 :(得分:0)

这个 repo 看起来很有前途:Androidplot

它似乎支持从 gradle 导入,而不是在本地保留 jar 文件。我也考虑过 AnyChart,但它是一个付费使用的库,而 Androidplot 是在 Apache 2.0 许可下提供的。

自述文件截图:

screenshot

只需从他们的 quickstart guide 复制和粘贴,以防链接断开:


添加依赖

要在您的 gradle 项目中使用该库,请将以下内容添加到您的 build.gradle:

dependencies {
    compile "com.androidplot:androidplot-core:1.5.7"
}

如果您使用 Proguard 混淆(Android Studio 创建的项目默认使用),您还将 想将此添加到您的 proguard-rules.pro 文件中:

-keep class com.androidplot.** { *; }

创建您的活动 XML 布局

创建 Android 项目框架后,创建 res/layout/simple_xy_plot_example.xml 并添加一个 XYPlot 视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:ap="http://schemas.android.com/apk/res-auto"
              android:layout_height="match_parent"
              android:layout_width="match_parent">

    <com.androidplot.xy.XYPlot
        style="@style/APDefacto.Dark"
        android:id="@+id/plot"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        ap:title="A Simple XY Plot"
        ap:rangeTitle="range"
        ap:domainTitle="domain"
        ap:lineLabels="left|bottom"
        ap:lineLabelRotationBottom="-45"/>
</LinearLayout>

此示例使用默认样式来装饰绘图。 XML 样式属性的完整列表是 在这里可用。虽然定期添加新属性, 并非所有可配置的属性都可用。

如果缺少您需要的东西,请使用 Fig Syntax 直接在您的 Plot 的 XML 中,在每个属性前加上“androidPlot”。示例:

androidPlot.title="My Plot"

创建活动

现在让我们创建一个活动来显示我们刚刚在 simple_xy_plot_example.xml 中定义的 XYPlot。
基本步骤是:

  1. 创建一个 Series 实例并用要显示的数据填充它。
  2. 在绘图实例中注册一个或多个系列以及用于描述系列在绘制时的外观的格式化程序。
  3. 画图

由于我们处理的是 XY 数据,因此我们将使用 XYPlot、SimpleXYSeries(这是一个 XYSeries 接口的实现)和 LineAndPointFormatter:

import android.app.Activity;
import android.graphics.*;
import android.os.Bundle;

import com.androidplot.util.PixelUtils;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYSeries;
import com.androidplot.xy.*;

import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.*;

/**
 * A simple XYPlot
 */
public class SimpleXYPlotActivity extends Activity {

    private XYPlot plot;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_xy_plot_example);

        // initialize our XYPlot reference:
        plot = (XYPlot) findViewById(R.id.plot);

        // create a couple arrays of y-values to plot:
        final Number[] domainLabels = {1, 2, 3, 6, 7, 8, 9, 10, 13, 14};
        Number[] series1Numbers = {1, 4, 2, 8, 4, 16, 8, 32, 16, 64};
        Number[] series2Numbers = {5, 2, 10, 5, 20, 10, 40, 20, 80, 40};

        // turn the above arrays into XYSeries':
        // (Y_VALS_ONLY means use the element index as the x value)
        XYSeries series1 = new SimpleXYSeries(
                Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series1");
        XYSeries series2 = new SimpleXYSeries(
                Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series2");

        // create formatters to use for drawing a series using LineAndPointRenderer
        // and configure them from xml:
        LineAndPointFormatter series1Format =
                new LineAndPointFormatter(this, R.xml.line_point_formatter_with_labels);

        LineAndPointFormatter series2Format =
                new LineAndPointFormatter(this, R.xml.line_point_formatter_with_labels_2);

        // add an "dash" effect to the series2 line:
        series2Format.getLinePaint().setPathEffect(new DashPathEffect(new float[] {

                // always use DP when specifying pixel sizes, to keep things consistent across devices:
                PixelUtils.dpToPix(20),
                PixelUtils.dpToPix(15)}, 0));

        // just for fun, add some smoothing to the lines:
        // see: http://androidplot.com/smooth-curves-and-androidplot/
        series1Format.setInterpolationParams(
                new CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal));

        series2Format.setInterpolationParams(
                new CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal));

        // add a new series' to the xyplot:
        plot.addSeries(series1, series1Format);
        plot.addSeries(series2, series2Format);

        plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() {
            @Override
            public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
                int i = Math.round(((Number) obj).floatValue());
                return toAppendTo.append(domainLabels[i]);
            }
            @Override
            public Object parseObject(String source, ParsePosition pos) {
                return null;
            }
        });
    }
}

上面代码中一个可能令人困惑的部分是 LineAndPointFormatter 的初始化
您可能注意到它们神秘地引用了 xml 资源文件。这实际上是 使用 Fig 从 XML 配置实例属性。

如果您希望避免使用 XML 并将所有内容保留在 Java 中,只需替换代码:

LineAndPointFormatter series1Format = 
    new LineAndPointFormatter(this, R.xml.line_point_formatter_with_labels);

与:

LineAndPointFormatter series1Format = new LineAndPointFormatter(Color.RED, Color.GREEN, Color.BLUE, null);

一般来说,XML 配置应该在可能的情况下用于编程配置,因为它会产生 在通过屏幕密度等定义属性方面具有更大的灵活性。有关如何进行的更多详细信息 以编程方式配置格式化程序等。请参阅最新的 Javadoc。

继续上面的原始示例,将这些文件添加到您的 /res/xml 目录:

/res/xml/line_point_formatter_with_labels.xml

<?xml version="1.0" encoding="utf-8"?>
<config
    linePaint.strokeWidth="5dp"
    linePaint.color="#00AA00"
    vertexPaint.color="#007700"
    vertexPaint.strokeWidth="20dp"
    fillPaint.color="#00000000"
    pointLabelFormatter.textPaint.color="#CCCCCC"/>

/res/xml/line_point_formatter_with_labels_2.xml

<?xml version="1.0" encoding="utf-8"?>
<config
    linePaint.strokeWidth="5dp"
    linePaint.color="#0000AA"
    vertexPaint.strokeWidth="20dp"
    vertexPaint.color="#000099"
    fillPaint.color="#00000000"
    pointLabelFormatter.textPaint.color="#CCCCCC"/>