AChartEngine似乎没有响应我的命令

时间:2013-05-07 03:31:21

标签: android achartengine

我正在尝试使用AChartEngine为我正在创建的应用构建一个真正简化的图表。使用存储在全局类中的数据,我正在尝试创建一个水平条形图,在每条线上显示一个变量,使用不可见的轴,并在每个相应条的末尾显示每个变量的值。它应该看起来好像每个变量都保存在TableRow的单独TableLayout中,并且每个条都位于相应行的下一列中,该变量的值位于该栏旁边(或在第三栏)。

我知道如何在理论上做一些这样的事情,并且尚未弄清楚其他部分。我有一个简单的设置,我从一个教程和一些提供的示例代码派生出来:

private GraphicalView mChart;

private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();

private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

private XYSeries mCurrentSeries;

private XYSeriesRenderer mCurrentRenderer;

private void initChart() {
    mCurrentSeries = new XYSeries("Sample Data");
    mDataset.addSeries(mCurrentSeries);
    mCurrentRenderer = new XYSeriesRenderer();
    mRenderer.addSeriesRenderer(mCurrentRenderer);
    mRenderer.setOrientation(Orientation.VERTICAL);
    mRenderer.addXTextLabel(1, "xyzxyzxyz");
    mRenderer.addXTextLabel(2, "abcabca");
    mRenderer.addXTextLabel(3, "tqrstuvwx");
    mRenderer.setBarSpacing(1);
    mRenderer.setApplyBackgroundColor(true);
    mRenderer.setMargins(new int[]{0,0,0,0});
    mRenderer.setBackgroundColor(Color.TRANSPARENT);
    mRenderer.setShowLegend(false);
    mRenderer.setShowLabels(true);
    mRenderer.setShowAxes(false);
    mRenderer.setZoomEnabled(false, false);
    mRenderer.setPanEnabled(false, false);
    mRenderer.setGridColor(Color.TRANSPARENT);
}

private void addSampleData() {
    mCurrentSeries.add(1, 85);
    mCurrentSeries.add(2, 75);
    mCurrentSeries.add(3, 70);
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

protected void onResume() {
    super.onResume();
    LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
    if (mChart == null) {
        initChart();
        addSampleData();
        mChart = ChartFactory.getBarChartView(this, mDataset, mRenderer, Type.DEFAULT);
        layout.addView(mChart);
    } else {
        mChart.repaint();
    }
}

我对代码有以下问题:

  1. 我认为渲染器就是渲染图表的工作原理。但就我而言,mRenderermCurrentRenderer之间的区别是什么?

  2. 目前,setShowAxes()false,但轴仍在显示。那是为什么?

  3. setShowLabels()true,这似乎是正确的,因为我需要显示变量,但图表的x轴的位置使得它可以搜索任何变量标签。如何让x轴提供足够的空间来显示最长的变量,或者在一定数量的字符后包装标签的文本?

  4. 我不希望这个图表看起来像一个典型的图表,我希望它如上所述显示。实现此目的的一部分是将背景颜色设置为透明。我这样做了,但即使父布局的背景颜色为D0E4F7,它仍然显示为黑色。我也使用了setGridColor(Color.TRANSPARENT),这似乎有效,允许网格颜色成为我的布局背景颜色。但是,我仍然需要网格外部区域的背景透明。

  5. 我正在使用setBarSpacing(),这似乎工作正常,但我还需要设置每个条的宽度。我可以用什么方法来做到这一点?

  6. 我需要图表不填充整个视图,而是适合视图的特定部分。图表的LinearLayout将包含在RelativeLayoutScrollView中,以便将其正确放置在屏幕上。在XML中,我设置了layout_weight="0"并指定了layout_height="200dp"。这有效,但会使所有文本垂直“挤压”。如何在避免这种情况下调整大小?

  7. AChartEngine是否适合使用正确的库,或者我是否想将方形钉固定在圆孔中?

  8. 感谢您的帮助。我很乐意根据需要发布更多代码片段。

    编辑:Dan的回复的后续行动:

    (1)感谢您的解释,这肯定有帮助。我假设他们都可以用initChart()方法调用吗?

    (2)X轴和Y轴都显示。

    (3)有没有办法移动轴?您链接的文章与我的问题不同。我的标签在网格之外,不在条形图上,而是在标记上。

    (4)我意识到我从未在这里问过一个问题 - 如何将网格周围的区域设置为透明?

    (5)我不确定你的意思是什么?我可以使用什么方法手动设置每个条的宽度?

    (6)我不确定你为什么要跳过这个 - 你暗示它与(3)有关吗?

    (7)在这里,我真的认为你误解了我的来源。我并不怀疑AChartEngine的有效性或质量 - 我选择开始使用它,因为很多人都认为它是一种高质量的选择。当我说“似乎没有响应我的命令”时,我并不是故意暗示它没有反应,我认为很明显我根本无法让它做我想做的事。

    当我问(7)AChartEngine是否真的是正确的选择,或者我是否期望它做一些不是为了做的事情时,我想知道什么?当我构建一个条形图,然后选择删除所有功能(轴,标签,背景,动态比例等),并在字面上只显示条形图本身(因此使用AChartEngine,因为它能够创建一个给定输入变量的指定长度的条形码),我想知道我是否正在使用飞机去相当于杂货店的图表。

    我希望,在某种程度上,这篇文章会引出“是的,这是正确的选择,这是有道理的”,或“不,你试图用手榴弹打猎,你可以做你想做的事情以更简单的方式“。我认为这是一个合法的问题,而且一点都不应该冒犯你。仅仅因为它过去适用于5000多个应用程序并不意味着它是我正在尝试做的正确的解决方案。任何有关它是否真的是正确选择的建设性想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

  1. mCurrentRenderer定义了当前系列的显示方式,而mRenderer定义了整个图表的显示方式。
  2. 还有哪些轴显示?如果你说的是真的那么这可能被称为潜在的错误。我也不知道你试图使用什么版本的AChartEngine。你能发一个截图吗?
  3. 已知issue的水平条形图。移动轴:renderer.setMargins([top, left, bottom, right]);
  4. 试试renderer.setMarginsColor(color)
  5. setBarWidth()可用于仅包含一个项目的系列(系列中的一个单个栏)。对于其他系列,您可以使用setBarSpacing()参数来更改条形宽度作为副作用。
  6. 使用renderer.setInScroll(true);
  7. AChartEngine绝对是显示大量图表类型的不错选择。但是,水平条形图(水平显示条形图)处于实验模式,我通常不建议任何人使用它,除非他们真的想要。肯定有一些其他的图表引擎,但我还没有评估过一个,所以我不能说它有更好的或其他有多好。也许时间会证明。
  8. 一旦你想到这一点,如果你将继续使用AChartEngine路线,我建议你只用一个问题就可以发布更短的问题。否则,这些很难一起回答或者可能需要永远解决。