我正在尝试使用 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();
}
}
我对代码有以下疑问:
我已经收集到渲染器的工作,你知道,渲染图表。
mRenderer
但是,就我而言,和之间有什么区别mCurrentRenderer
?现在,
setShowAxes()
isfalse
,但坐标轴仍在显示。这是为什么?setShowLabels()
istrue
,这似乎是正确的,因为我需要显示变量,但是图表的 x 轴的位置使得它可以挤压任何变量标签。如何让 x 轴有足够的空间来显示最长的变量,或者在一定数量的字符之后换行标签的文本?我不希望这个图表看起来像一个典型的图表,我希望它像我上面描述的那样显示。实现这一点的一部分是将背景颜色设置为透明。我这样做了,但它仍然显示为黑色,即使父布局的背景颜色是
D0E4F7
. 我也使用setGridColor(Color.TRANSPARENT)
了,这似乎有效,允许网格颜色成为我的布局背景颜色。但是,我仍然需要网格外区域的背景是透明的。我正在使用
setBarSpacing()
,这似乎工作正常,但我还需要设置每个条的宽度。我可以使用什么方法来做到这一点?我需要图表不填充整个视图,而是适合视图的特定部分。图表的
LinearLayout
将被包裹在 aRelativeLayout
和 aScrollView
中,以便在屏幕上正确定位。在 XML 中,我设置layout_weight="0"
并指定了layout_height="200dp"
. 这可行,但会导致所有文本垂直“挤压”。如何在避免这种情况的同时调整大小?AChartEngine 甚至是用于此目的的正确库,还是我试图将方形钉安装到圆孔中?
感谢您的任何帮助。我很乐意根据需要发布更多代码片段。
编辑:跟进丹的回应:
(1) 感谢您的解释,这绝对有帮助。我假设它们都可以在initChart()
方法中调用?
(2) X 轴和 Y 轴均显示。
(3) 有没有办法移动轴?您链接的文章与我的问题不同。我的标签在网格之外,不是在条上,而是在刻度上。
(4) 我意识到我从来没有在这里真正问过一个问题——如何将网格周围的区域设置为透明的?
(5) 我不知道你的意思是什么?我可以使用什么方法手动设置每个条的宽度?
(6)我不确定你为什么要跳过这个——你是在暗示它与(3)有关吗?
(7) 这就是我真的认为你误解了我来自哪里的地方。我并不怀疑 AChartEngine 的有效性或质量——我选择开始使用它是因为很多人认为它是一种质量选择。当我说“似乎没有响应我的命令”时,我并不是要暗示它没有响应,我认为很明显我根本无法让它做我想让它做的事情。
当我问 (7) 时,我想知道 AChartEngine 是否真的是正确的选择,或者我是否期望它做一些它不适合做的事情?当我构建条形图然后选择删除所有功能(轴、标签、背景、动态比例等)并在设定的比例上仅显示条本身(因此使用 AChartEngine 来创建一个给定输入变量的指定长度的条形图),我想知道我是否正在做相当于使用飞机去杂货店的图表。
我部分希望这篇文章会引起“是的,这是正确的选择,这是有道理的”,或者“不,你想用手榴弹去打猎,你可以做你想做的事。更简单的方法”。我认为这是一个合法的问题,而且一点也不应该冒犯你。仅仅因为它过去适用于 5000 多个应用程序并不意味着它是我正在尝试做的事情的正确解决方案。如果您对这是否是正确的选择有任何建设性的想法,我们将不胜感激。