3

我想在我的活动中集成一个简单的 XY 折线图。在寻找可定制的免费图表(可定制的背景、颜色、轴标签)时,我发现了两个候选者:Achartengine 和 Adnroidplot。还有一些其他库,但它们不可定制或仅作为单独的 Intent 提供。

我还需要支持较旧的 Android API(必须支持至少 1.6)。

我尝试了 Achartengine,但是当我将它集成到 ScrollView 中时它失败了。当我滚动时,图表不知何故损坏,被挤压,一些背景元素似乎消失了。

然后我尝试了 Adnroidplot。起初它没有从 1.6 开始,因为有 Pair 类。但我在 Adnroidplot 论坛上找到了解决该问题的方法。一切似乎都运行良好,虽然自定义观察者运行良好,但动态更新也运行良好。自定义 X 轴标签有点困难(我需要自定义字符串而不是数字),但使用自定义格式化程序我终于做到了。

但后来我用来自客户数据库的真实数据进行了尝试。有一些具有相等值的点系列。我很震惊地看到 Adnroidplot 无法绘制水平线,它挂起或完全弄乱了图表!

这是测试用例,我从 Adnroidplot Quickstart 中借用了它,并做了一些小修改以制作一个具有相等值的系列:

pricesPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot);

// Create array of y-values to plot:
Number[] series1Numbers = {7, 7}; // horizontal line expected, got nothing or hang

// Turn the above arrays into XYSeries:
XYSeries series1 = new SimpleXYSeries(
    Arrays.asList(series1Numbers),          // SimpleXYSeries takes a List so turn our array into a List
    ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
            "Series1");                             // Set the display title of the series

// Create a formatter to use for drawing a series using LineAndPointRenderer:
LineAndPointFormatter series1Format = new LineAndPointFormatter(
            Color.rgb(0, 200, 0),                   // line color
            Color.rgb(0, 100, 0),                   // point color
            null);              // fill color (optional) <- my app hangs if I add it for a horizontal line

// Add series1 to the xyplot:
pricesPlot.addSeries(series1, series1Format);

// Reduce the number of range labels
pricesPlot.setTicksPerRangeLabel(3);

// By default, AndroidPlot displays developer guides to aid in laying out your plot.
// To get rid of them call disableAllMarkup():
pricesPlot.disableAllMarkup();

我已经在 Adnroidplot 论坛上发帖了,但我不确定他们会以多快的速度回答以及何时解决问题。

所以我希望 StackOverflow 的某个人可能知道一些解决方法?

4

3 回答 3

3

感谢 Androidplot 论坛上的开发人员,我现在得到了解决方案。以下代码是我的 Activity.java 文件的片段。不幸的是,最终代码后来被重构,一些部分移到了自定义数据源和自定义 XYSeries,我无权在此处发布。

此代码适用于 Androidplot-core-0.4.4-release.jar,我不确定它是否适用于更高版本。

// for chart
private XYPlot pricesPlot;

/** Called when the activity is first created. */   
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ... other initialisation code omitted for brevity ...

    pricesPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot);

    // the following code was added as a debug code to test that it works.
    // later many things were changed, so take it "as is" - this was the core of the solution

    PriceDatesFormat ppf = new PriceDatesFormat();
    ppf.Labels = new String[]{
                "2011-01",
                "2011-05",              
                "2011-07",
                "2011-11",
                "2011-07",
                "2011-07"                       
        }; 

    pricesPlot.getGraphWidget().setDomainValueFormat(ppf);       

    // Create two arrays of y-values to plot:
    Float [] seriesNumbers = new Float[]{118f, 185f};

   Float min = Collections.min(Arrays.asList(seriesNumbers));
   Float max = Collections.max(Arrays.asList(seriesNumbers));  

   pricesPlot.setRangeBoundaries(min - 0.1*min, max + 0.1*max, BoundaryMode.AUTO);// make them a bit wider out of min/max values
于 2012-02-03T18:21:03.003 回答
1

对于那些使用 AChartEngine 在 ScrollView 中搜索图表压缩问题的人来说,这是解决问题的方法:

renderer.setInScroll(true);
于 2014-12-04T12:25:31.347 回答
1

我想出了一个简单的解决方法来确保显示水平线。

基本上,在加载第一个真实绘图之前,只需绘制一个 3 点清晰的 Y_VALS_ONLY 系列。

假设你有一个 colors.xml res 文件,你可以像这样创建一个清晰的系列:

声明:

Number[] yClear = {0, 1, 0};
LineAndPointFormatter clearFormat; 
SimpleXYSeries clear= null;

在您的 onCreate() 或 onViewCreated() 中:

clearFormat = new LineAndPointFormatter(getResources().getColor(R.color.transparent), getResources().getColor(R.color.transparent), 0, null);

然后在设置好绘图后,只需将清晰的绘图添加到图表中即可;

clear = new SimpleXYSeries( Arrays.asList(yClear), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Clear");
yourPlot.addSeries(clear, clearFormat);

我花了几个小时试图调试这个问题,它归结为只是让生活变得轻松并以这种方式去做。

于 2014-02-06T00:15:00.117 回答