MPChart Android setCircleColor不反映

时间:2019-01-24 15:31:39

标签: java android charts

我一直在使用MPChartAndroid库。

我正在使用

  

setCircleColor()

更改lineDataSet中的圆圈颜色 奇怪的是,方法setCircleColor()setCircleHoleColor()无法正常工作。

通过mDataSet.getCircleHoleColor()mDataSet.getCircleColor()从折线图查询返回新颜色,但是即使在mChart.invalidate()之后,图表仍显示旧颜色。

我也尝试过

  mDataSet.resetCircleColors();
  mDataSet.setCircleColor(color);

  mDataSet.setDrawCircles(true);

但似乎不起作用。

尽管方法

mDataSet.setColor()
mDataSet.setFillColor() 

工作正常。

硬件加速是否存在问题,或者我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

我正在使用setCircleColor和getCircleHoleColor。它们工作正常,但是在将LineDataSet添加到LineData之前先定义它,然后将LineData分配给LineChart,然后在LineChart上调用invalidate方法

lineChart是com.github.mikephil.charting.charts.LineChart

LineData lineData = new LineData();
LineDataSet lineDataSet = new LineDataSet(lineDataEntries, null);
lineDataSet.setDrawCircles(true);
lineDataSet.setDrawCircleHole(false);
lineDataSet.setCircleColor(Color.RED);
lineDataSet.setMode(LineDataSet.Mode.LINEAR);
lineData.addDataSet(lineDataSet);
lineChart.setData(lineData);
lineChart.invalidate();

注意:MpChart setCircleColor不接受R.color.id作为参数。您必须先使用一种颜色类型或根据资源颜色ID创建一个新的颜色类型,然后再使用它。可以使用ResourcesCompat.getColor方法完成。

答案 1 :(得分:0)

显然,LineChartRenderer类存储每个数据集的圆形位图的位图缓存。

如果LineChartRenderer中的此方法返回true,则会生成新的位图。

   /**
         * Sets up the cache, returns true if a change of cache was required.
         *
         * @param set
         * @return
         */
        protected boolean init(ILineDataSet set) {

            int size = set.getCircleColorCount();
            boolean changeRequired = false;

            if (circleBitmaps == null) {
                circleBitmaps = new Bitmap[size];
                changeRequired = true;
            } else if (circleBitmaps.length != size) {
                circleBitmaps = new Bitmap[size];
                changeRequired = true;
            }

            return changeRequired;
        }

因此,即使通过setCircleColor()setCircleHoleColor()设置了新颜色,也不会创建新的位图,因此图表会显示旧的色环。

这个问题可以通过以下方式解决

  1. 清除位图缓存数组。 (如果没有导入库作为模块,则无法实现,因为circleBitmaps是私有的)

2。使用自定义 LineChartRenderer

3。通过欺骗init()方法以返回true。 因此要动态更改圆圈颜色,请使用

 mDataSet.setDrawCircles(true);
int colorCount= mDataSet.getCircleColors().size();
mDataSet.resetCircleColors();
mDataSet.setCircleColor(color);
if(colorCount==1){mDataSet.getCircleColors().add(color);}

代替

 mDataSet.setCircleColor(color);

并要动态更改圆孔颜色,请使用

mDataSet.setCircleColorHole(color);
int circleColor= mDataSet.getCircleColors().get(0);
int colorCount = mDataSet.getCircleColors().size();
mDataSet.resetCircleColors();
mDataSet.setCircleColor(circleColor);
if(colorCount==1){mDataSet.getCircleColors().add(circleColor);}

代替

 mDataSet.setCircleColorHole(color);
  

注意:仅当您计划使用单个圆圈颜色时,此方法才有效!           在MpChartAndroid v3.0.2上测试

感谢@cristallo的帮助。

答案 2 :(得分:0)

在科特林中: 使用不同的圆圈颜色:

lineDataSet.setDrawCircles(true)
                val colorCount: Int = lineDataSet.circleColors.size
                if (colorCount>0){
                    lineDataSet.resetCircleColors()
                    lineDataSet.circleColors.addAll(multipleCircleColorList)
                    if (colorCount == multipleCircleColorList.size) {
                        lineDataSet.circleColors.add(Color.TRANSPARENT)
                    }
                }
lineChart.invalidate()

答案基于@Omkar 的答案。谢谢@Omkar