如何阻止Android夜间模式更改自定义View的绘制颜色?
问题解决方案
这个问题是Android 10及以上系统的自动深色主题适配特性导致的,按以下步骤即可解决:
- 第一步:禁用自定义View的自动深色反转
系统默认会对未适配深色主题的View做自动颜色反转,把白色背景直接转成黑色,你可以在自定义View的构造方法中添加代码关闭该特性:
// Java写法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { setForceDarkAllowed(false); }
// Kotlin写法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { forceDarkAllowed = false }
也可以直接在布局XML中给自定义View添加属性:
<你的自定义View全类名 ... android:forceDarkAllowed="false" />
- 第二步:优化onDraw背景绘制逻辑
你当前调用canvas.drawColor(Color.WHITE)默认用的是SRC_OVER混合模式,可能和画布底层残留的深色缓存混合异常,改成先清除再绘制即可:
// 替换原有绘制背景的代码 canvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR); canvas.drawColor(Color.WHITE);
- 第三步:兜底方案
如果上述操作后仍有问题,可以直接在View构造方法中显式设置背景色,优先级高于系统主题适配,不需要依赖onDraw绘制背景:
setBackgroundColor(Color.WHITE);
内容的提问来源于stack exchange,提问作者Diken Mhrz
相关产品推荐
相关产品推荐

