我的Android AChartEngine已经工作,但如何让它好看吗?(My Android AC

2019-07-30 05:35发布

我猜题给我大部分的问题了,但我们的细节,并给一点背景知识:

我有一个Android应用主要集中于将在TimeCharts可以显示一些不同的实时数据片。 所以,我已经有一个服务与抓取数据,分析它,并添加值单身的TimeSeries数据源进行通信。 当用户导航和移出片段的片段简单地添加正确的TimeSeries并保持呼叫mChartView.repaint(); 每500ms

所有这一切都运作和跨标签,旋转,通知等工作很好

因为它是一个平板电脑应用我想达到两个目的:1)最大限度地观赏区; 2)使它看起来不错。

1)我已删除的变焦按钮(出于某种原因,如果我尝试使用它们添加它给了我NullException) mRenderer.setZoomButtonsVisible(false); 但还是有一个巨大的底部边缘服用大量的屏幕空间。 我尝试设置一个负边界,和它的作品,但唱片公司不同意这个边境移动,我结束了与X轴跨越的标签,甚至将它们传递。 我怎样才能与边框移动标签下来,也许把他们在图表的顶部?

2))的应用程序是用户可配置为使用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)在图表周围的用户缩放和平移,图表停止更新/重新缩放屏幕,用户在最新的值必须保持平移看到最新的值。 我加的动作条一个“重置缩放”按钮,但我不能使它发挥作用。 什么是使值再次更新代码。

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);

在我的动作条中,我有暂停/恢复和ResetZoom按钮。 复位缩放很简单:

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

有持有引用到总是从WiFi读取最新的数据,并将它们添加到一系列时间序列后台服务。 这样一来,在该片段中有一个可运行的执行每调用重绘()为700毫秒:

// 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。

感谢丹大量的答案和创建该引擎的所有其他开发者。

编码快乐!

Answer 1:

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

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分钟且x最大值作为将被显示的范围,并调用mChartView.repaint(); 之后。

d)同为C)

作为一个建议,请尝试在几个较小的分裂这么长的问题,你可以更快地得到答案。 不会有太多的ACE用户知道如何回答所有的问题。 即使这个库的作者必须考虑一些答案:)



Answer 2:

为了除去该图表的滚动:mRenderer.setZoomEnabled(假); mRenderer.setPanEnabled(假);



文章来源: My Android AChartEngine is already working, but how to make it look good?