我想在我的活动中集成一个简单的xy折线图。在寻找具有自定义(可自定义背景、颜色、轴标签)的免费图表时,我发现了两个候选项:achartengine和adnroidplot。还有一些其他的库,但是它们不是可定制的,或者只能作为单独的意图使用。
我还需要支持旧的android api(至少必须支持1.6)。
我试过阿卡丁发动机,但当我把它集成到滚动视图中时失败了。当我滚动的时候,图表不知怎么的被破坏了,它被挤压了,一些背景元素似乎消失了。
然后我尝试了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的人能知道一些解决办法?
最佳答案
感谢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