Bud*_*ius 7 android achartengine
我想这个标题会泄露我的大部分问题,但让我们详细介绍一下背景:
我有一个主要针对平板电脑的Android应用,它将在TimeCharts中显示一些不同的实时数据.所以我已经有了一个服务来与数据源进行通信,数据源抓取数据,解析它并将值添加到单例TimeSeries.当用户导入和导出片段时,片段只需添加正确的TimeSeries并保持mChartView.repaint();每500ms 调用一次
所有这些都是可操作的,并且可以在标签,旋转,通知等方面很好地工作
因为它是一款平板电脑应用,我希望实现两件事:1)最大化观看区域; 2)让它看起来不错.
1)我已经删除了缩放按钮(出于某种原因,如果我尝试添加它们,它给我NullException),mRenderer.setZoomButtonsVisible(false);但是仍然有一个巨大的底部边缘占用了大量的屏幕空间.我尝试设置一个负边框,它可以工作,但标签不会随着这个边框移动而我最终会让X轴越过标签甚至传递它们.如何使用边框向下移动标签,或者将它们放在图表的顶部?
2)a)应用程序是用户可配置为使用Holo_Dark或Holo_light.所以我在渲染器上使用透明背景(请参阅下面的代码片段)来显示holo所做的漂亮背景阴影.如何更改轴文本颜色?我找到了mRenderer.setAxesColor(color)但它只改变了行,而不是文本.
int color = Color.argb(0, 255, 255, 255); // Transparent colour
mRenderer.setBackgroundColor(color);
mRenderer.setMarginsColor(color);
Run Code Online (Sandbox Code Playgroud)
b)Y轴在它的标签顶部交叉,我怎样才能将它们向左偏移一点,以便文本可读?(它不是setMargins())
c)当用户在图表周围进行缩放和平移时,图表会停止更新/重新缩放屏幕上的最新值,并且用户必须保持平移以查看最新值.我在ActionBar上添加了一个"重置缩放"按钮,但我无法使其工作.什么是使值再次更新的代码.
d)如果我的TimeSeires的范围是10分钟(每秒2个值),我怎么能让它只显示最后1分钟(例如),如果用户想要之前的值,他可以反击?(以及c上的使用按钮)重新开始)
目前我的渲染设置为:
int color = Color.argb(0, 255, 255, 255); // Transparent colour
mRenderer.setBackgroundColor(color);
mRenderer.setMarginsColor(color);
mRenderer.setAxisTitleTextSize(16); // 16
mRenderer.setChartTitleTextSize(20); // 20
mRenderer.setLabelsTextSize(15); // 15
mRenderer.setLegendTextSize(15); // 15
mRenderer.setPointSize(0); // 10
mRenderer.setMargins(new int[] { 20, 30, 15, 0 });
mRenderer.setZoomButtonsVisible(false);
mRenderer.setShowAxes(true);
mRenderer.setShowLegend(true);
mRenderer.setShowGridX(true);
mRenderer.setShowLabels(true);
Run Code Online (Sandbox Code Playgroud)
每个渲染添加到多个渲染器的方式如下:
renderer.setDisplayChartValues(false);
mRenderer.addSeriesRenderer(renderer);
Run Code Online (Sandbox Code Playgroud)
非常感谢所有的帮助!
编辑只是为了包含我的最终代码供其他人查看:
我最终完全放弃了图例,并在图表上方浮动实现了我自己的图例,因此布局是一个带有ChartView和TableLayout的FrameLayout.
我实现了一个由几个类扩展的抽象CurvesFragment类.
我在片段OnCreateView中配置图表为:
mChartView = ChartFactory.getTimeChartView(getActivity().getApplicationContext(), mDataset, mRenderer, "HH:mm:ss"); // X axis in a time scale
// Setup chart renderer =============================
mRenderer.setLabelsTextSize(15); // Text size
mRenderer.setMargins(new int[] { 0, Utils.convertToPx(5, getActivity().getApplicationContext()), 0, 0 }); // 5dp on the left to show that little line
mRenderer.setZoomButtonsVisible(false); // bye bye zoom
mRenderer.setShowAxes(true); // show both axes
mRenderer.setShowLegend(false); // bye bye legend
mRenderer.setShowGridX(true); // X grid helps identify values
mRenderer.setShowLabels(true); // See the values
mRenderer.setYLabelsAlign(Align.LEFT); // put the Y labels on the left of the axis
if (Utils.getCurrentTheme(getActivity().getApplicationContext()) == android.R.style.Theme_Holo) {
mRenderer.setXLabelsColor(getResources().getColor(android.R.color.primary_text_dark));
mRenderer.setYLabelsColor(0, getResources().getColor(android.R.color.primary_text_dark));
mRenderer.setMarginsColor(getResources().getColor(android.R.color.background_dark));
legend.setBackgroundResource(R.drawable.border_dark);
} else {
// same as above but for Holo_light
}
// And from here proceed to add the TimeCharts with using
renderer.setDisplayChartValues(false);
Run Code Online (Sandbox Code Playgroud)
在我的操作栏上,我包含了Pause/Resume和ResetZoom的按钮.重置缩放很简单:
mRenderer.setXAxisMax(-Double.MAX_VALUE);
mRenderer.setXAxisMin(Double.MAX_VALUE);
mRenderer.setYAxisMax(-Double.MAX_VALUE);
mRenderer.setYAxisMin(Double.MAX_VALUE);
mChartView.repaint();
Run Code Online (Sandbox Code Playgroud)
有一个后台服务,它包含对TimeSeries的引用,它总是从WiFi读取新数据并将它们添加到系列中.这样,在片段中有一个runnable执行每700ms调用repaint()为:
// Chart rendering control ========================
private Runnable updateDataSet = new Runnable() {
public void run() {
if (!chartPaused) {
double max = mRenderer.getXAxisMax(); // get renderer maximum value
double min = mRenderer.getXAxisMin(); // get renderer minimum value
// Check if the user scrolled/zoomed/panned the graph or if it's on 'auto'
if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) {
double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series
double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into
mRenderer.setXAxisMax(newMax); // set the new values
mRenderer.setXAxisMin(newMin);
}
// Logic that updates the TableLayout with the legend is placed here
mChartView.repaint();
}
getView().postDelayed(updateDataSet, 700);
}
};
Run Code Online (Sandbox Code Playgroud)
并且有一个ZoomListener和一个PanListener,每次用户触摸它时都会暂停图表.这样用户可以缩放和平移,但每当它恢复图表更新时,它只会向前滚动到最早的数据而不改变缩放级别.
我猜最终结果非常稳定,在Holo_Light和Holo_Dark上看起来都不错.
感谢LOT丹的答案和创建该引擎的所有其他开发者.
快乐的编码!
Dan*_* D. 14
问题1.您可以尝试使用这些API调用:
mRenderer.setShowLegend(false);
Run Code Online (Sandbox Code Playgroud)
要么
mRenderer.setMargins(new int[] {top, left, bottom, right});
Run Code Online (Sandbox Code Playgroud)
也许降低底值?
问题2. a)
mRenderer.setXLabelsColor();
mRenderer.setYLabelsColor();
Run Code Online (Sandbox Code Playgroud)
b)
mRenderer.setXLabelsAlign();
Run Code Online (Sandbox Code Playgroud)
C)
当系列获得新值时,我认为您可以执行以下操作:
mRenderer.setXAxisMin();
mRenderer.setXAxisMax();
Run Code Online (Sandbox Code Playgroud)
提供x min和x max值作为要显示的范围并调用mChartView.repaint(); 之后.
d)与c)相同
作为一个建议,请尝试将这些长问题分成几个较小的问题,你可以更快地得到答案.没有多少ACE用户知道如何回答所有问题.即使是这个图书馆的作者也要考虑一些答案:)
| 归档时间: |
|
| 查看次数: |
10464 次 |
| 最近记录: |