在Android上绘制图表 - androidplot和achartengine的问题

时间:2012-02-03 09:09:22

标签: android charts androidplot

我想在我的Activity中集成一个简单的XY线图。在寻找带有自定义(自定义背景,颜色,轴标签)的免费图表时,我找到了两个候选人:Achartengine和Adnroidplot。还有一些其他库,但它们不可自定义或仅作为单独的Intents提供。

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

我尝试过Achartengine,但是当我将它集成到ScrollView中时失败了。当我滚动时,图表变得有些腐蚀,它被挤压,一些背景元素似乎消失了。

然后我尝试了Adnroidplot。起初它没有从1.6开始因为Pair类。但我在Adnroidplot论坛上找到了解决问题的方法。一切似乎工作正常,虽然自定义Observers工作正常,也动态更新。自定义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的某个人可能知道一些解决方法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);

我花了好几个小时试图调试这个问题,结果就是让生活变得简单并且这样做。

答案 2 :(得分:1)

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

renderer.setInScroll(true);