7

我想标题给出了我的大部分问题,但让我们详细介绍一下背景:

我有一个主要针对平板电脑的 Android 应用程序,它将在 TimeCharts 中显示一些不同的实时数据。所以我已经有一个服务来与抓取数据的数据源进行通信,解析它并将值添加到单例 TimeSeries。当用户导航进出片段时,片段只需添加正确的 TimeSeries 并保持mChartView.repaint();每 500 毫秒调用一次

所有这些都是可操作的,并且可以在选项卡、轮换、通知等方面很好地工作。

因为它是一个平板应用程序,所以我想实现两件事:1)最大化查看区域;2)让它看起来不错。

1)我已经删除了缩放按钮(出于某种原因,如果我尝试添加它们,它会给我 NullException),mRenderer.setZoomButtonsVisible(false);但仍然有一个巨大的底部边距占用大量屏幕空间。我尝试设置一个负边框,它可以工作,但是标签不会随着这个边框移动,最终我的 X 轴会越过标签甚至通过它们。如何将标签与边框一起向下移动,或者将它们放在图表的顶部?

2) a) 用户可将应用配置为使用 Holo_Dark 或 Holo_light。所以我在渲染器上使用透明背景(见下面的片段)来显示全息的漂亮背景阴影。如何更改轴文本颜色?我找到了,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);

非常感谢所有的帮助!

编辑只是为了包含我的最终代码供其他人查看:

我最终完全放弃了图例,并在图表上方实现了我自己的图例,因此布局是带有 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);

在我的操作栏上,我包含了暂停/恢复和重置缩放按钮。重置缩放很简单:

        mRenderer.setXAxisMax(-Double.MAX_VALUE);
        mRenderer.setXAxisMin(Double.MAX_VALUE);
        mRenderer.setYAxisMax(-Double.MAX_VALUE);
        mRenderer.setYAxisMin(Double.MAX_VALUE);
        mChartView.repaint();

有一个后台服务保存对 TimeSeries 的引用,该引用始终从 WiFi 读取新数据并将它们添加到系列中。这样,在片段中有一个每 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的回答以及创建引擎的所有其他开发人员。

快乐编码!

4

2 回答 2

14

问题 1. 您可以尝试使用这些 API 调用:

mRenderer.setShowLegend(false);

或者

mRenderer.setMargins(new int[] {top, left, bottom, right});

也许降低底部值?

问题 2. a)

mRenderer.setXLabelsColor();
mRenderer.setYLabelsColor();

b)

mRenderer.setXLabelsAlign();

C)

当系列获得新值时,我认为您可以执行以下操作:

mRenderer.setXAxisMin();
mRenderer.setXAxisMax();

提供 x min 和 x max 值作为要显示的范围并调用 mChartView.repaint(); 之后。

d) 同 c)

作为一个建议,请尝试将这么长的问题分成几个较小的问题,您可能会更快地得到答案。知道如何回答所有问题的 ACE 用户并不多。甚至这个图书馆的作者也不得不考虑一些答案:)

于 2012-07-09T07:35:46.607 回答
1

删除该图表的滚动:mRenderer.setZoomEnabled(false); mRenderer.setPanEnabled(false);

于 2014-08-06T12:02:01.827 回答