- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想标题已经回答了我的大部分问题,但让我们详细介绍一下背景:
我有一个主要针对平板电脑的 Android 应用程序,它将在 TimeCharts 中显示一些不同的实时数据。所以我已经有一个服务来与获取数据的数据源通信,解析它并将值添加到单例 TimeSeries。当用户导航进出 fragment 时, fragment 只需添加正确的 TimeSeries 并保持每 500 毫秒调用一次 mChartView.repaint();
所有这些都可以在标签、旋转、通知等方面很好地运行和工作。
因为它是一款平板电脑应用,所以我想实现两件事:1) 最大化可视区域; 2) 让它看起来不错。
1) 我已经用 mRenderer.setZoomButtonsVisible(false);
移除了缩放按钮(出于某种原因,如果我尝试添加它们,它会给我 NullException),但仍然有一个巨大的底部边距很多屏幕空间。我尝试设置一个负边框,它起作用了,但标签不会随着这个边框移动,我最终 X 轴穿过标签甚至超过它们。如何将标签与边框一起向下移动,或者将它们放在图表的顶部?
2)a) 该应用程序可由用户配置为使用 Holo_Dark 或 Holo_light。所以我在渲染器上使用透明背景(见下面的 fragment )来显示 holo 所做的漂亮背景阴影。如何更改轴文本颜色?我找到了 mRenderer.setAxesColor(color)
但它只更改了行,而不是文本。
int color = Color.argb(0, 255, 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, 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);
并且添加到多渲染器的每个渲染如下:
renderer.setDisplayChartValues(false);
mRenderer.addSeriesRenderer(renderer);
非常感谢所有的帮助!
编辑只是为了包括我的最终代码以供其他人查看:
我最终完全放弃了图例并实现了我自己的 float 在图表上方的图例,因此布局是一个带有 ChartView 和 TableLayout 的 FrameLayout。
我实现了一个由几个类扩展的抽象 CurvesFragment 类。
我在 fragment 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);
在我的操作栏上,我包含了暂停/恢复和重置缩放按钮。重置缩放很简单:
mRenderer.setXAxisMax(-Double.MAX_VALUE);
mRenderer.setXAxisMin(Double.MAX_VALUE);
mRenderer.setYAxisMax(-Double.MAX_VALUE);
mRenderer.setYAxisMin(Double.MAX_VALUE);
mChartView.repaint();
有一个后台服务保存对 TimeSeries 的引用,该服务始终从 WiFi 读取新数据并将它们添加到系列中。这样,在 fragment 中有一个 runnable 每 700 毫秒执行一次调用 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 的回答以及创建该引擎的所有其他开发人员。
编码愉快!
最佳答案
问题 1. 您可以尝试使用这些 API 调用:
mRenderer.setShowLegend(false);
或
mRenderer.setMargins(new int[] {top, left, bottom, right});
也许降低底值?
问题 2。一)
mRenderer.setXLabelsColor();
mRenderer.setYLabelsColor();
二)
mRenderer.setXLabelsAlign();
c)
我认为当系列获得新值时,您可以执行以下操作:
mRenderer.setXAxisMin();
mRenderer.setXAxisMax();
提供x min 和x max 值作为要显示的范围并调用mChartView.repaint();之后。
d) 与 c) 相同
作为一个建议,请尝试将这么长的问题分成几个较小的问题,您可能会更快地得到答案。知道如何回答所有问题的 ACE 用户并不多。即使是这个库的作者也必须考虑一些答案:)
关于android - 我的 Android AChartEngine 已经可以工作了,但是如何让它看起来更好呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309065/
我正在尝试执行 vagrant up 但一直遇到此错误: ==> default: IOError: [Errno 13] Permission denied: '/usr/local/lib/pyt
我在容器 div 中有一系列动态创建的不同高度的 div。 Varying text... Varying text... Varying text... Varying text.
通过 cygwin 运行 vagrant up 时遇到以下错误。 stderr: /bin/bash: /home/vagrant/.ansible/tmp/ansible-tmp-14872260
今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来! 犹记得我在做机器学习和数据分析方面的毕设时,
我是 vagrant 的新手,正在尝试将第二个磁盘添加到我正在用 vagrant 制作的虚拟机中。 我想出了如何在第一次启动虚拟机时连接磁盘,但是当我关闭机器时 然后再次备份(使用 'vagrant
我是一名优秀的程序员,十分优秀!