我在使用TimeChart显示注释时遇到问题。我有一个GraphUtil类,它具有以下返回GraphicalView的静态方法:
public static GraphicalView getGraph(Activity activity, XYMultipleSeriesRenderer graphRenderer, XYMultipleSeriesDataset dataset, TimeSeries series, XYSeriesRenderer seriesRenderer) {
dataset.addSeries(series);
graphRenderer.addSeriesRenderer(seriesRenderer);
series.addAnnotation("Hi", 100, 100);
return ChartFactory.getTimeChartView(activity, dataset, graphRenderer, "M/d");
}
它是从片段中调用的,使用如下方法:
private void initFlexionGraph() {
mflexionSeries = getFlexionData();
mflexionDataset = new XYMultipleSeriesDataset();
mflexionGraphRenderer = new XYMultipleSeriesRenderer();
mflexionSeriesRenderer = new XYSeriesRenderer();
mflexionGraph = GraphUtil.getGraph(getActivity(), mflexionGraphRenderer, mflexionDataset, mflexionSeries, mflexionSeriesRenderer);
((LinearLayout) this.getView().findViewById(R.id.flexion_graph)).addView(mflexionGraph);
}
这是我的getFlexionData()方法:
private TimeSeries getFlexionData() {
int count = cursor.getCount();
List<Date> dates = new ArrayList<Date>(count);
List<Double> flexions = new ArrayList<Double>(count);
if (cursor.moveToFirst()) {
do {
dates.add(DateUtil.getBeginningCalendarTimeOfDate(cursor.getLong(cursor.getColumnIndex("date"))).getTime());
flexions.add(cursor.getDouble(cursor.getColumnIndex("best_flexion")));
} while (cursor.moveToNext());
TimeSeries flexionSeries = new TimeSeries();
for (int i = 0; i < dates.size(); i++) {
flexionSeries.add(dates.get(i), flexions.get(i));
}
}
return flexionSeries;
}
图表的其余部分显示效果很好,但在任何地方都没有注释。我还为mflexionSeriesRenderer和mflexionGraphRenderer设置了一些属性,但我在这里省略了它们。如果您认为可能存在问题,我可以发布它们。
当我转到另一个标签并返回时,我得到一个IndexOutOfBoundsException:
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at org.achartengine.util.IndexXYMap.getXByIndex(IndexXYMap.java:76)
at org.achartengine.model.XYSeries.getAnnotationX(XYSeries.java:260)
at org.achartengine.chart.XYChart.draw(XYChart.java:307)
at org.achartengine.GraphicalView.onDraw(GraphicalView.java:181)
我的onResume()方法包含了这段代码(这可能不是一种有效的重绘方式,但只是调用repaint()对我来说不起作用):
if (mflexionGraph == null) {
initFlexionGraph();
} else {
mflexionSeries = getFlexionData();
mflexionGraph = GraphUtil.getGraph(getActivity(), mflexionGraphRenderer, mflexionDataset, mflexionSeries, mflexionSeriesRenderer);
((LinearLayout) this.getView().findViewById(R.id.flexion_graph)).removeAllViews();
((LinearLayout) this.getView().findViewById(R.id.flexion_graph)).addView(flexionGraph);
mflexionGraph.repaint();
}
我不确定为什么注释没有显示(我的LinearLayout是300 x 300,所以应该出现(100,100)的字符串)。我正在使用achartengine-1.2.0(从2014年3月24日的夜间版本下载)。有什么想法吗?
答案 0 :(得分:0)
试试这个例子
private LinearLayout chartLayout;
private GraphicalView mChart;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showTimeGraph();
}
private void showTimeGraph()
{
chartLayout = (LinearLayout) findViewById(R.id.graphHolder);
XYMultipleSeriesDataset dataset1 = new XYMultipleSeriesDataset();
TimeSeries series1 = new TimeSeries("timeseries");
series1 = getFlexionData();
// dataset1.addSeries(0, series1);
double[] limits = new double[] { 0, 40, 0, 200 };
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setChartTitle("Title");
multiRenderer.setXTitle("x axis");
multiRenderer.setYTitle("y axis");
multiRenderer.setYLabelsAlign(Align.LEFT);
multiRenderer.setBarSpacing(1);
multiRenderer.setBarWidth(10);
multiRenderer.setYAxisMin(0);
multiRenderer.setYAxisMax(250);
multiRenderer.setXAxisMin(-1);
multiRenderer.setXAxisMax(10);
multiRenderer.setLabelsTextSize(15);
multiRenderer.setLegendTextSize(20);
multiRenderer.setAxisTitleTextSize(20);
multiRenderer.setChartTitleTextSize(20);
multiRenderer.setLabelsColor(Color.BLACK);
multiRenderer.setAxesColor(Color.BLACK);
multiRenderer.setApplyBackgroundColor(true);
// multiRenderer.setBackgroundColor(Color.TRANSPARENT);
multiRenderer.setMarginsColor(Color.argb(0, 255, 255, 255));
multiRenderer.setXLabelsColor(Color.BLACK);
multiRenderer.setYLabelsColor(0, Color.BLACK);
multiRenderer.clearXTextLabels();
// multiRenderer.setYLabels(0); //remove units on the Y axis(the horizontal
// axis since the graph has been rotated 90 degree)
// multiRenderer.setXLabels(0);
multiRenderer.setXLabelsPadding(-10f); // no effect
// multiRenderer.setYLabelsPadding(20f);
// multiRenderer.setMargins(new int[]{90, 0, 90, 0}); //top, left, bottom,
// right.
multiRenderer.setOrientation(org.achartengine.renderer.XYMultipleSeriesRenderer.Orientation.HORIZONTAL);
XYSeriesRenderer incomeRenderer = new XYSeriesRenderer();
incomeRenderer.setColor(Color.BLUE);
incomeRenderer.setChartValuesTextSize(20);
incomeRenderer.setFillPoints(true);
incomeRenderer.setDisplayChartValues(true);
incomeRenderer.setChartValuesTextAlign(Align.CENTER);
// multiRenderer.addSeriesRenderer(incomeRenderer);
// NumberFormat noFormat = new DecimalFormat( "##0.#E0" );
multiRenderer.setYLabels(5);
// multiRenderer.setYLabelFormat( noFormat ,0);
multiRenderer.setInScroll(true);
// multiRenderer.setZoomEnabled(false, false);
// multiRenderer.setPanEnabled(false, false);
multiRenderer.setClickEnabled(false);
multiRenderer.setSelectableBuffer(10);
String[] types = new String[] { BarChart.TYPE };
// setChartSettings(multiRenderer);
// Intent intent = ChartFactory.getBarChartIntent(context, dataset1,
// multiRenderer, null);
// Intent intent = ChartFactory.getCombinedXYChartIntent(context, dataset,
// multiRenderer, types, null);
// multiRenderer.setOrientation(Orientation.VERTICAL);
// mChart = (GraphicalView) ChartFactory.getBarChartView(context,
// getBarDataSet(),getBarRenderer() ,null);
// mChart = (GraphicalView) ChartFactory.getBarChartView(context, dataset1,
// multiRenderer, null);
mChart = getGraph(this, multiRenderer, dataset1,series1,incomeRenderer);
// mChart = (GraphicalView) ChartFactory.getTimeChartView(this, dataset1,multiRenderer , "M/d");// "M/d"
chartLayout.addView(mChart);
}
protected DefaultRenderer buildCategoryRenderer(int[] colors) {
DefaultRenderer renderer = new DefaultRenderer();
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setMargins(new int[] { 20, 30, 15, 0 });
for (int color : colors) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(color);
renderer.addSeriesRenderer(r);
}
return renderer;
}
public static GraphicalView getGraph(Activity activity, XYMultipleSeriesRenderer graphRenderer,
XYMultipleSeriesDataset dataset, TimeSeries series, XYSeriesRenderer seriesRenderer)
{
dataset.addSeries(series);
graphRenderer.addSeriesRenderer(seriesRenderer);
seriesRenderer.setAnnotationsColor(Color.BLACK);
series.addAnnotation("THis is your Annotation", 4, 200);
return ChartFactory.getTimeChartView(activity, dataset, graphRenderer, "M/d");
}
private TimeSeries getFlexionData()
{
TimeSeries series1 = new TimeSeries("timeseries");
series1 = new TimeSeries("timeseries");
long value = new Date().getTime() - 3 * TimeChart.DAY;
Random rr = new Random();
for(int i = 0; i < 5; i++)
{
series1.add( i , 100 + rr.nextInt() % 100);
}
return series1;
}