TimeChart上的AChartEngine注释不起作用

时间:2014-03-24 23:52:48

标签: android achartengine

我在使用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日的夜间版本下载)。有什么想法吗?

1 个答案:

答案 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;
    }