MPAndroidChart 折线图动态设置不同折点的颜色

前言:最近在学习MPAndroidChart动态绘制折线图其中有一功能是根据y轴的值不同而显示不同颜色的折线点,由于不知道图表的底层绘制流程走了很多弯路,最后真是山重水尽疑无路*******,好,不扯了,进入正题我的方法有可能不是最好了解决方案,但是效果是绝对抹油问题的。有兴趣的童靴可以参考一下。

setCircleColors方法

在LineDataSet类中,使用setCircleColors()设置折线中设置X点对应点的颜色,其方法通过重载可以传递的参数类型有

List<Integer>、int... colors、int[] colors, Context c

如果是静态数据使用此方法没有一点问题,如果是动态数据需要动态更新数据的话就要不好使,在第一次加载完折线数据后更新时无论怎么setCircleColors改变它的值都没有任何效果。其原因就在于getCircleColor(int index)方法只有在第一次创建加载LineDataSet时才会执行一次,再向LineDataSet更新改变颜色数据时则不会再执行getCircleColor(int index)方法,会以第一次设置加载的颜色为准。知道原因后我修改了代码如下

注:getCircleColor(int index)方法的作用是根据index的值获取颜色集合中相对应位置上的颜色值。

关键代码

private void setData() {
        ArrayList<Entry> values = new ArrayList<Entry>();
        ArrayList<Integer> colors = new ArrayList<Integer>();

        for (int i = 0; i < yList.size(); i++) {
            float val = yList.get(i);
            values.add(new Entry(i, val));
        }
        mChart.getXAxis().setLabelCount(yList.size(),false);
        mChart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return xStringList.get((int) value);
            }
        });
        LineDataSet set1;
        /**************判断图中是否已有LineDataSet,如果有就删除,重新创建加载****************/
        if (mChart.getData() != null &&
                mChart.getData().getDataSetCount() > 0) {
            mChart.getData().removeDataSet(0);
        }
            // create a dataset and give it a type
            set1 = new LineDataSet(values, "");

            set1.setDrawIcons(false);

            set1.setColor(Color.BLACK);
            /******************************/
            //循环判断y值,并向颜色集合中添加对应的颜色
            for (int i = 0; i < yList.size(); i++) {
                if (yList.get(i)>200) colors.add(Color.RED);
                else colors.add(Color.GREEN);
            }
            set1.setCircleColors(colors);
            /******************************/
            set1.setLineWidth(1f);
            set1.setCircleRadius(5f);
            set1.setDrawCircleHole(false);
            set1.setValueTextSize(12f);
            set1.setDrawFilled(false);
            set1.setFormLineWidth(1f);
            set1.setFormSize(15.f);


            ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
            dataSets.add(set1); // add the datasets


            // create a data object with the datasets
            LineData data = new LineData(dataSets);

            // set data
            /**************设置数据,并移动到最新点的位置****************/
            mChart.setData(data);
            mChart.moveViewToX(set1.getEntryCount()-1);
            /******************************/

    }

最后看一下效果吧

到此结束,希望会对有缘人有所帮助,如果有任何问题都可以在下方评论提问哦!

猜你喜欢

转载自blog.csdn.net/qq_38217237/article/details/83068426