我'm trying to use AChartEngine to build a really, really simplified chart for an app I' m创造 . 使用存储在全局类中的数据,我正在尝试创建一个水平条形图,在每条线上显示一个变量,使用不可见的轴,并在每个相应条的末尾显示每个变量的值 . 它应该看起来几乎就像每个变量都保存在 TableLayout
的单独 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()
是false
,但轴仍在显示 . 这是为什么? -
setShowLabels()
是true
,这似乎是正确的,因为我需要显示变量,但图表的x轴定位使得它搜索任何变量标签 . 如何使x轴提供足够的空间来显示最长的变量,或者在一定数量的字符后包装标签的文本? -
我不希望这个图表看起来像一个典型的图表,我希望它如上所述显示 . 实现此目的的一部分是将背景颜色设置为透明 . 我这样做了,但即使父布局的背景颜色是
D0E4F7
,它仍然显示为黑色 . 我也使用setGridColor(Color.TRANSPARENT)
,这似乎工作,允许网格颜色成为我的布局背景颜色 . 但是,我仍然需要网格外部区域的背景是透明的 . -
我正在使用
setBarSpacing()
,这似乎工作正常,但我还需要设置每个条的宽度 . 我可以使用什么方法来做到这一点? -
我需要图表不填充整个视图,而是适合视图的特定部分 . 图表的
LinearLayout
将包装在RelativeLayout
和ScrollView
中,以便将其正确放置在屏幕上 . 在XML中,我设置了layout_weight="0"
并指定了layout_height="200dp"
. 这有效,但会导致所有文本垂直"squished" . 如何在避免这种情况下调整大小? -
AChartEngine甚至是正确使用的库,还是我试图将方形钉固定在圆孔中?
感谢您的帮助 . 我很乐意根据需要发布更多代码片段 .
编辑:Dan的回复的后续行动:
(1)感谢您的解释,这肯定有帮助 . 我假设他们都可以在 initChart()
方法中调用?
(2)X轴和Y轴都显示 .
(3)有没有办法移动轴?您链接的文章与我的问题不同 . 我的标签在网格之外,不在条形图上,而是在标记上 .
(4)我意识到我从未在这里问过一个问题 - 如何将网格周围的区域设置为透明?
(5)我不确定你的意思是什么?我可以使用什么方法手动设置每个条的宽度?
(6)我不确定你为什么要跳过这个 - 你暗示它与(3)有关吗?
(7)在这里,我真的认为你错误地解释了我来自哪里 . 我并不怀疑AChartEngine的有效性或质量 - 我选择开始使用它,因为很多人都认为它是一种高质量的选择 . 当我说“似乎没有响应我的命令”时,我并不是故意暗示它没有反应,我认为很明显我根本无法让它做我想做的事 .
当我问(7)时,我想知道AChartEngine是否真的是正确的选择,或者我是否期望它做一些不是为了做的事情?当我构建一个条形图,然后选择删除所有功能(轴,标签,背景,动态比例等),并在字面上只显示条形图本身(因此使用AChartEngine,因为它能够创建一个给定输入变量的指定长度的条形图),我想知道我是否正在使用飞机到达杂货店的图表 .
我希望,在某种程度上,这篇文章会引出“是的,这是正确的选择,这是有道理的”,或者“不,你试图用手榴弹打猎,你可以做多少你想要的东西更简单的方式“ . 我认为这是一个合法的问题,而且是一个问题不要冒犯你一点儿 . 仅仅因为它过去适用于5000个应用程序并不意味着它是我正在尝试做的正确的解决方案 . 任何有关它是否实际上是正确选择的建设性想法都将非常感激 .
1 回答
mCurrentRenderer
定义了当前系列的显示方式,而mRenderer
定义了整个图表的显示方式 .还有哪些轴显示?如果你说的是真的那么这可能被称为潜在的错误 . 我也不知道你试图使用什么版本的AChartEngine . 你能发一个截图吗?
水平条形图已知issue . 移动轴:
renderer.setMargins([top, left, bottom, right]);
试试
renderer.setMarginsColor(color)
.setBarWidth()
可用于仅包含一个项目的系列(系列中的一个单个栏) . 对于其他系列,您可以使用setBarSpacing()
参数来更改条形宽度作为副作用 .使用
renderer.setInScroll(true);
AChartEngine绝对是显示大量图表类型的不错选择 . 然而,水平条形图(水平显示条形图)处于实验模式,我通常不会评估一个,所以我不能说它有一个更好或其他有多好 . 也许时间会证明 .
一旦你搞清楚了,如果你继续使用AChartEngine路线,我建议你只用一个问题就可以发布更短的问题了 . 否则,这些很难一起回答,或者可能需要永远弄明白 .