微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我的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(颜色),但它只更改了行,而不是文本.

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

每个渲染添加到Multiple渲染器的内容如下:

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为答案以及创建引擎的所有其他开发人员提供了很多帮助.

快乐的编码!

解决方法

问题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 min和x max值作为要显示的范围并调用mChartView.repaint();之后.

d)与c)相同

作为一个建议,请尝试将这些长问题分成几个较小的问题,你可以更快地得到答案.没有多少ACE用户知道如何回答所有问题.即使是这个图书馆的作者也要考虑一些答案:)

原文地址:https://www.jb51.cc/android/316127.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐