如何在夜间模式下调暗MPAndroidChart饼图的扇区显示颜色
问题根因
你当前手动通过Color.HSVToColor硬编码生成的扇区颜色没有接入系统夜间模式的色彩适配逻辑,而MPAndroidChart的图例组件默认会自动跟随主题调整颜色亮度,两者适配逻辑不一致导致显示差异。
可行解决方案
方案1:根据夜间模式状态动态调整HSV参数(推荐,保留自动生成颜色的逻辑)
检测当前系统是否开启夜间模式,动态调整饱和度和亮度的取值,修改代码如下:
fun drawClientsChart( chart: PieChart, data: ArrayList<ListItemAnalyticClients>, withConsult: Boolean = false, withAnimation: Boolean = true ) { ... val hsv = FloatArray(3) // 检测夜间模式状态 val nightModeFlags = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { // 夜间模式降低饱和度和亮度 hsv[1] = 0.3f hsv[2] = 0.6f } else { // 日间模式保留原有参数 hsv[1] = 0.5f hsv[2] = 0.89f } for (i in 0 until data.size) { ... hsv[0] = (330 * i/data.size).toFloat() colors.add(Color.HSVToColor(hsv)) } ... catsSet.colors = colors // 数值文字颜色也可以同步适配,避免夜间过亮 val textColor = if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) { context.resources.getColor(R.color.light_gray, context.theme) } else { context.resources.getColor(R.color.white, context.theme) } pieData.setValueTextColor(textColor) ... chart.setHoleColor(Color.TRANSPARENT) ... // 最后强制刷新图表 chart.invalidate() }
方案2:使用主题属性定义颜色组
在资源文件中分别定义日间和夜间的饼图颜色数组,直接读取系统适配好的颜色,避免手动计算色差:
- 在
res/values/colors.xml(日间配置)添加:
<array name="pie_chart_colors"> <item>#xxxxxx</item> <item>#xxxxxx</item> <!-- 按需求添加足够多的颜色项 --> </array>
- 在
res/values-night/colors.xml(夜间配置)添加适配后的低饱和颜色数组,长度和日间数组保持一致:
<array name="pie_chart_colors"> <item>#xxxxxx</item> <item>#xxxxxx</item> <!-- 和日间颜色一一对应,调整为低饱和暗色调 --> </array>
代码中直接读取适配后的颜色数组:
val colorArray = context.resources.obtainTypedArray(R.array.pie_chart_colors) for (i in 0 until data.size) { colors.add(colorArray.getColor(i % colorArray.length(), Color.GRAY)) } colorArray.recycle()
方案3:关闭图例自动颜色适配(不需要图例调暗时可选)
如果希望图例和扇区颜色完全一致,可以强制关闭图例的主题适配:
chart.legend.isTextColorAuto = false chart.legend.textColor = context.resources.getColor(R.color.your_fixed_color, context.theme)
内容的提问来源于stack exchange,提问作者Андрей Ананьев
相关产品推荐
相关产品推荐

