1

我正在尝试使用 AChartEngine 为我正在创建的应用程序构建一个非常非常简化的图表。使用存储在全局类中的数据,我正在尝试创建一个水平条形图,该条形图在每条线上显示一个变量,带有不可见的轴,并且每个变量的值位于每个相应条的末尾。它应该看起来几乎就像每个变量都保存在单独TableRow的 a 中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. 我已经收集到渲染器的工作,你知道,渲染图表。mRenderer但是,就我而言,和之间有什么区别mCurrentRenderer

  2. 现在,setShowAxes()is false,但坐标轴仍在显示。这是为什么?

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

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

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

  6. 我需要图表不填充整个视图,而是适合视图的特定部分。图表的LinearLayout将被包裹在 aRelativeLayout和 aScrollView中,以便在屏幕上正确定位。在 XML 中,我设置layout_weight="0"并指定了layout_height="200dp". 这可行,但会导致所有文本垂直“挤压”。如何在避免这种情况的同时调整大小?

  7. AChartEngine 甚至是用于此目的的正确库,还是我试图将方形钉安装到圆孔中?

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

编辑:跟进丹的回应:

(1) 感谢您的解释,这绝对有帮助。我假设它们都可以在initChart()方法中调用?

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

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

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

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

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

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

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

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

4

1 回答 1

0
  1. mCurrentRenderer定义当前系列的显示mRenderer方式,同时定义整个图表的一般显示方式。
  2. 哪些轴仍在显示?如果你说的是真的,那么这可能被称为潜在的错误。我也不知道您要使用哪个版本的 AChartEngine。你能发一个截图吗?
  3. 水平条形图已知问题。移动轴:renderer.setMargins([top, left, bottom, right]);
  4. 试试renderer.setMarginsColor(color)
  5. setBarWidth()可用于只有一个项目的系列(系列中的一个单条)。对于其他系列,您可以只使用setBarSpacing()改变条形宽度的参数作为副作用。
  6. 利用renderer.setInScroll(true);
  7. AChartEngine 绝对是显示大量图表类型的好选择。但是,水平条形图(条形水平显示)处于实验模式,我通常不建议任何人使用它,除非他们真的想要。肯定还有其他一些图表引擎,但我从未评估过其中一个,所以我不能说有更好的引擎或其他引擎有多好。也许时间会证明一切。

一旦你弄清楚这一点,如果你将继续使用 AChartEngine 路线,我建议你最好只用一个问题发布较短的问题。否则,这些问题很难一起回答,或者可能需要很长时间才能弄清楚。

于 2013-05-07T07:05:52.283 回答