滚动时使用GraphView的水平标签问题

时间:2019-04-04 15:22:57

标签: android label horizontal-scrolling android-graphview

我的(线型)GraphView面临一些奇怪的问题! 为了更好地解释它,我将添加一张图片,显示开始水平滚动(不需要垂直滚动)时发生的情况。

Scrolling Problem

问题是: 数据点显示正确,但标签显示不正确!我在上面的图片中用红色写了正确的标签!

每当我开始滚动标签时,它们就会怪异地开始“跳跃”。

从具有String / Integer对的SharedPreference文件中接收数据点[字符串始终为MMMyyyy(例如“ Mar2020”)]

我从我的SP文件中获取了配对,将字符串作为静态标签放入图形中,以这种“逻辑”方式使用DataPoints(而不是实际代码!)

DataPoint[0] = (0, valueOfKey0)
DataPoint[1] = (1, valueOfKey1)

以下是在活动中如何调用/绘制图形的代码

 private void setupGraph(final GraphView graph, String subName){
    GraphDataHelper graphDataHelper = new GraphDataHelper(mContext);
    LineGraphSeries<DataPoint> series;


    /*Have to call .removeAllSeries to draw each graph individually
    * Otherwise they will be drawn over another!*/
    graph.removeAllSeries();

    /*Gets Values from each Sub
    * --> Gets values form each key/value pair of specific SharedPreference-file
    * --> sets values in order (0, 1, 2,... n)*/
    series = new LineGraphSeries<DataPoint>(graphDataHelper.generateGraphData(subName));
    series.setDrawDataPoints(true);
    series.setColor(getResources().getColor(R.color.casualWhite));
    series.setAnimated(true);

    graph.addSeries(series);

    /*Fill Labels for X-Axis:
    * Get the specific Monthly-Keys for the choosen Sub
    * In special cases extra rules are declared in .getSpecificSubMonthKeys() method
    * Put all entries of ArrayList in Array (StaticLabelsFormatter only works with "normal" Array)*/
    ArrayList<String> array_paths = graphDataHelper.getSpecificSubMonthKeys(subName);
    int size = array_paths.size();

    String[] paths = new String[size];

    for (int i=0; i<size; i++){
        paths[i] = array_paths.get(i);
    }


    StaticLabelsFormatter staticLabelsFormatter = new StaticLabelsFormatter(graph);
    staticLabelsFormatter.setHorizontalLabels(paths);
    graph.getGridLabelRenderer().setLabelFormatter(staticLabelsFormatter);

    graph.getViewport().setXAxisBoundsManual(true);

    if(size == 5 || size > 5){
        graph.getViewport().setMinX(0.0);
        graph.getViewport().setMaxX(4.0);
        graph.getGridLabelRenderer().setNumHorizontalLabels(5);
    } else if(size == 4){
        graph.getViewport().setMinX(0.0);
        graph.getViewport().setMaxX(3.0);
        graph.getGridLabelRenderer().setNumHorizontalLabels(4);
    } else if(size == 3){
        graph.getViewport().setMinX(0.0);
        graph.getViewport().setMaxX(2.0);
        graph.getGridLabelRenderer().setNumHorizontalLabels(3);
    } else if(size == 2){
        graph.getViewport().setMinX(0.0);
        graph.getViewport().setMaxX(1.0);
        graph.getGridLabelRenderer().setNumHorizontalLabels(2);
    }


    graph.getViewport().setScrollable(true);


    graph.getGridLabelRenderer().setHorizontalLabelsColor(getResources().getColor(R.color.midBlue));
    graph.getGridLabelRenderer().setVerticalLabelsColor(getResources().getColor(R.color.midBlue));
    graph.getGridLabelRenderer().setGridColor(getResources().getColor(R.color.darkBlue));
    graph.getGridLabelRenderer().setPadding(50);
    graph.getGridLabelRenderer().setLabelsSpace(30);

我之所以要求使用.removeAllSeries,是因为用户可以通过下拉菜单Spinner调用其他图形。

我还设置了不同的MinX和MaxX点,因为可能会出现一个条目还没有5个DataPoints的情况,因此我就此改变了视口(没有找到更好的解决方案,所以我是也可以在此处打开一些更好的代码,但是它确实可以这样工作)。我的SharedPreference文件始终至少有2个键/值对

还有一点额外的问题:是否有办法只给水平标签一些额外的标签空间。如果使用setLabelSpace,它也将应用于垂直标签,但我不希望这样做。但是水平标签离轴太近了。

也为难看的代码感到抱歉。这是我第一次使用GraphView!

谢谢!

0 个答案:

没有答案