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