用一句话来说,适配深色模式的唯一的工作就是打开你的app界面,打开系统深色模式,把app图片、资源、颜色等等,在黑色night目录下同样适配一套 深色模式的UI。
适配深色模式不能依赖于系统的强制反色,因为全局反色是在miui12的系统代码上才有的,在miui11之中的深色模式是没有全局反色功能的,因此App需要手动适配深色模式
app通过资源id等方式获取资源文件时,如果在深色模式下,app会读取对应-night-目录的资源文件,规律如下:
普通模式 | 深色模式 |
---|---|
values | values-night |
color | color-night |
drawable | drawable-night |
drawable-nxdpi | drawable-night-nxdpi |
drawable-xhdpi | drawable-night-xhdpi |
drawable-xxhdpi | drawable-night-xxhdpi |
drawable-xxxhdpi | drawable-night-xxxhdpi |
values-nhdpi | values-night-nhdpi |
以此类推,文件夹的命名规律就是中间插入: -night-
切换到深色模式时,资源应用的优先顺序:
- 应用提供的-night资源
- 应用设置的默认资源(通常是亮色下的资源,也可以是应用主动在深色模式下设置的主题)
- 系统的默认深色资源
- 系统默认的亮色资源
只要night文件夹放了对应的资源文件,系统开启深色模式设置开关就会自动读取night文件夹下的图片,night资源不会被系统全局反色,只有没主动适配的视图布局才可能会被全局反色。
如果App因为night资源数远超20个,由于系统的代码判断App,不会被强制反色。
小技巧:对于纯色图片或图标,如果不想让UI切两套图片(黑色调和白色调)放到不同的资源文件夹下,如果是xml文件,可以使用着色器,不同的控件需要使用不同的着色器,如下:
属性 | 深色模式适配方法 |
---|---|
Botton | BottonTint="@color/xxx" |
ImageView | tint="@color/xxx" |
background | backgroundTint="@color/xxx" |
drawableLeft | drawableTint="@color/xxx" |
可以在night目录下放对应的颜色,这样依赖系统读取night资源文件来达到适配深色模式的目的