安卓夜间模式的实现

    xiaoxiao2021-03-25  3

    为了更好的用户体验,如知乎、简书等阅读类的App都加入了切换夜间模式的功能。今天,就来学习下夜间模式的一种实现方式。

    前言

    原来Google官方对夜间模式支持并不给力,大家也想出各种方案来实现。然鹅,通过查阅相关资料,发现现在Google已经提供了对夜间模式的支持:使用Theme.AppCompat.DayNight主题便可以轻松实现。

    具体使用

    1 将我们主体继承Theme.AppCompat.DayNight <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> 2 在我们应用Application中初始化主题 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } }

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.XXXX);这个方法有四个参数可以选择,如下:

    MODE_NIGHT_NO 不使用夜间模式(亮色主题)MODE_NIGHT_YES 使用夜间模式(暗色主题)MODE_NIGHT_AUTO 自动切换日间和夜间模式MODE_NIGHT_FOLLOW_SYSTEM 跟随系统的模式

    其中自动模式是使用到定位API,以计算出准确的日出和日落的事件

    3 切换日间和夜间模式(即主体的切换)(1)获取当前主题 int mode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; (2)根据当前主题决定切换日间或者夜间模式 if (mode == Configuration.UI_MODE_NIGHT_YES) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } else if (mode == Configuration.UI_MODE_NIGHT_NO){ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); }

    效果如下:

    4 夜间模式下资源的适配 在上图中我们发现,切换主题后,textView字体颜色还是黑色,看不清。 其实不管颜色还是图片都可以跟随主题变化的,做法如下:这里以文字颜色为例,在res建立values-night的文件夹,将colors.xml文件考入,并且修改夜间模式下我们想要替换的颜色,效果如下:

    现在文字颜色也变化了,至于其他资源的替换做法也是类似的

    转载请注明原文地址: https://ju.6miu.com/read-155295.html

    最新回复(0)