Android 统计图HelloChart折线图两种特殊数据不能展示统计图问题记录和解决方法

项目中要用到统计图功能,经过比对发现HelloChart用的很多也很广泛

在使用LineChartView折线图时发现两个Bug

1、当只有两组数据且两组数据Y轴值相同时,折线图不显示

2、当有且只有一组数据时,折线图不显示

在网上查找到一大神debug源码后给出的解决方案,详情参照链接

在此也做个记录

问题1:通过debug调试发现:在计算RawX,RawY会出现pixelOffset为NaN的问题。(ChartComputator类)

public float computeRawX(float valueX) {
        // TODO: (contentRectMinusAllMargins.width() / currentViewport.width()) can be recalculated only when viewport
        // change.

        final float pixelOffset = (valueX - currentViewport.left) * (contentRectMinusAllMargins.width() /
                currentViewport.width());
        if (Float.isNaN(pixelOffset)||Float.isInfinite(pixelOffset)) {
            return contentRectMinusAllMargins.left + 0;

        }
        return contentRectMinusAllMargins.left + pixelOffset;
    }

问题二:这个方法计算Y轴最大值最小值,当所有数据一样,计算出的bottom和top相等,导致  
computeRawY中currentViewport.height()获取的值为0;所以修改如下:

private void calculateMaxViewport() {
        tempMaximumViewport.set(Float.MAX_VALUE, Float.MIN_VALUE, Float.MIN_VALUE, Float.MAX_VALUE);
        LineChartData data = dataProvider.getLineChartData();

        for (Line line : data.getLines()) {
            // Calculate max and min for viewport.
            for (PointValue pointValue : line.getValues()) {
                if (pointValue.getX() < tempMaximumViewport.left) {
                    tempMaximumViewport.left = pointValue.getX();
                }
                if (pointValue.getX() > tempMaximumViewport.right) {
                    tempMaximumViewport.right = pointValue.getX();
                }
                if (pointValue.getY() < tempMaximumViewport.bottom) {
                    tempMaximumViewport.bottom = pointValue.getY();
                }
                if (pointValue.getY() > tempMaximumViewport.top) {
                    tempMaximumViewport.top = pointValue.getY();
                }

            }
        }
        //解决最大值最小值相等时,图不能展示问题
        if (tempMaximumViewport.top == tempMaximumViewport.bottom) {
            tempMaximumViewport.top = tempMaximumViewport.top * 2;
            tempMaximumViewport.bottom = 0;
        }
    }

为帮助各位开发者更好的使用,在jitpack上新生成了一个引入库,欢迎使用 

implementation 'com.github.aliwh1203:HelloChartNew:v1.1'

本文感谢Android学习笔记-解决hellocharts折线图由于特殊数据不能展示的问题作者提供帮助!

你可能感兴趣的:(Android)