我一直在使用MPChartAndroid库。
我正在使用
setCircleColor()
更改lineDataSet中的圆圈颜色
奇怪的是,方法setCircleColor()
和setCircleHoleColor()
无法正常工作。
通过mDataSet.getCircleHoleColor()
和mDataSet.getCircleColor()
从折线图查询返回新颜色,但是即使在mChart.invalidate()之后,图表仍显示旧颜色。
我也尝试过
mDataSet.resetCircleColors();
mDataSet.setCircleColor(color);
mDataSet.setDrawCircles(true);
但似乎不起作用。
尽管方法
mDataSet.setColor()
mDataSet.setFillColor()
工作正常。
硬件加速是否存在问题,或者我在这里缺少什么?
答案 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()
设置了新颜色,也不会创建新的位图,因此图表会显示旧的色环。
这个问题可以通过以下方式解决
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