You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在夜间模式下调暗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,提问作者Андрей Ананьев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:18:00