我有一个主要针对平板电脑的Android应用,它将在TimeCharts中显示一些不同的实时数据.所以我已经有了一个服务来与数据源进行通信,数据源抓取数据,解析它并将值添加到单例TimeSeries.当用户导入和导出片段时,片段只需添加正确的TimeSeries并继续调用mChartView.repaint();每500ms
所有这些都是可操作的,可以在标签,旋转,通知等方面很好地工作.
因为它是一款平板电脑应用,我想实现两件事:1)最大化观看区域; 2)让它看起来不错.
1)我已经删除了缩放按钮(出于某种原因,如果我尝试添加它们,它给我NullException)和mRenderer.setZoomButtonsVisible(false);但是仍有巨大的底部空间需要大量的屏幕空间.我尝试设置一个负边框,它可以工作,但标签不会随着这个边框移动而我最终会让X轴越过标签甚至传递它们.
如何使用边框向下移动标签,或者将它们放在图形的顶部?
2)
a)该应用程序是用户可配置为使用Holo_Dark或Holo_light.所以我在渲染器上使用透明背景(请参阅下面的代码段)来显示holo所做的漂亮背景阴影.如何更改轴文本颜色?我找到了mRenderer.setAxesColor(颜色),但它只更改了行,而不是文本.
int color = Color.argb(0,255,255); // Transparent colour mRenderer.setBackgroundColor(color); mRenderer.setMarginsColor(color);
b)Y轴在其标签的顶部交叉,我如何将它们向左偏移一点,以便文本可读? (它不是用setMargins())
c)当用户在图表周围进行缩放和平移时,图表会停止更新/重新缩放屏幕上的最新值,并且用户必须保持平移以查看最新值.我在ActionBar上添加了一个“重置缩放”按钮,但我无法使其工作.什么是使值再次更新的代码.
d)如果我的TimeSeires的范围是10分钟(每秒2个值),我怎么能让它只显示最后1分钟(例如),如果用户想要以前的值,他可以反击? (以及c上的使用按钮)重新开始)
目前我的渲染设置为:
int color = Color.argb(0,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);
renderer.setDisplayChartValues(false); mRenderer.addSeriesRenderer(renderer);
非常感谢所有的帮助!
编辑只是为了包含我的最终代码供其他人查看:
我最终完全放弃了图例,并在图表上方浮动实现了我自己的图例,因此布局是一个带有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 }); // 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);
在我的操作栏上,我包含了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();
有一个后台服务,它包含对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); } };
并且有一个ZoomListener和一个PanListener,每次用户触摸它时都会暂停图表.这样用户可以缩放和平移,但每当它恢复图表更新时,它只会向前滚动到最早的数据而不改变缩放级别.
我猜最终的结果很稳固,在Holo_Light和Holo_Dark上看起来都不错.
感谢Dan为答案以及创建引擎的所有其他开发人员提供了很多帮助.
快乐的编码!
解决方法
mRenderer.setShowLegend(false);
要么
mRenderer.setMargins(new int[] {top,left,bottom,right});
也许降低底值?
问题2.
一个)
mRenderer.setXLabelsColor(); mRenderer.setYLabelsColor();
b)
mRenderer.setXLabelsAlign();
C)
当系列获得新值时,我认为您可以执行以下操作:
mRenderer.setXAxisMin(); mRenderer.setXAxisMax();
提供x min和x max值作为要显示的范围并调用mChartView.repaint();之后.
d)与c)相同
作为一个建议,请尝试将这些长问题分成几个较小的问题,你可以更快地得到答案.没有多少ACE用户知道如何回答所有问题.即使是这个图书馆的作者也要考虑一些答案:)