暗黑模式?安卓适配一波

暗黑模式?安卓适配一波

前言

第一次听到暗黑模式的时候,感受好酷啊,听着就好看(也不知道我怎么听出来的)。苹果在前几年就有暗黑模式的风声,好像是在IOS十一、IOS12的时候就说要推出了,结果愣生生等到了IOS13暗黑模式才推出。IOS13推出到如今已经大半年了,系统应用没得说,完美适配,三方应用也都陆续支持了暗黑模式,就连微信在前段时间的更新中也实现了暗黑模式,先来欣赏下微信的暗黑模式吧!html

正文

既然苹果实现了暗黑模式,那么安卓确定不能落下啊,因此在安卓10(Q API级别29)中支持了暗黑模式,不过官方的叫法为Dark theme,怎么翻译都行,先来看一下官方对暗黑模式的定义吧:android

这里就不一行行翻译了,主要来讲一下暗黑模式的好处吧:微信

  • 手机的屏幕目前大部分都已经升级成了OLED屏幕(固然还有一部分手机仍是LCD屏幕),OLED屏幕显示黑色的时候不会发光,能够大大减少功耗。
  • 提升了弱视用户和对强光敏感的用户的可见性。
  • 使任何人在昏暗的环境中都更容易使用设备。

怎样开启暗黑模式就很少说了,手机厂商不一样,开启方式不一样,各大手机厂商魔改的系统有时候真的找不到在哪设置,那就百度一下吧。app

设置暗黑主题

为了支持Dark主题,必须将应用的主题设置为继承自DayNight主题(res/values/styles.xml):ide

<style name="AppTheme" parent="Theme.AppCompat.DayNight"> 复制代码

还可使用 MaterialComponents的深色主题字体

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight"> 复制代码

这会将应用程序的主主题与系统控制的夜间模式标志相关联,并为应用程序提供默认的深色主题(启用时)。当系统的主题切换时,应用也会随之切换主题。ui

“这就完了?”google

“对啊,主题就设置完了。”编码

“那我若是想要自定义主题呢?”spa

你们平常开发中确定会有这种需求,官方定义的主题不彻底能知足咱们的需求,这时候就须要来自定义主题了,谷歌也为咱们想到了这一点。普通模式下我们不须要动,该怎么写怎么写,而后在res下再新建一个values-night的文件夹,而后把你自定义的放进去,name起成和styles.xml中对应的主题名称就能够了。来看一下吧:

这样设置完就OK了。

“不对啊,这只是主题变了,那个人Activity的背景、字体的颜色、图片等等该怎么办呢?”

“别着急,下面就要说了。”

这里必定要注意,主题和样式应避免在浅色主题下使用硬编码的颜色或图标,应该使用主题属性(首选)或夜间限定的资源。来了解下两个最重要的主题属性吧:

  • ?android:attr/textColorPrimary这是一种通用的文本颜色。浅色主题为近黑色,深色主题为近白。它包含禁用状态。
  • ?attr/colorControlNormal通用图标颜色。它包含禁用状态。

固然确定不是必需要使用上面官方提供的两个主题属性,想自定义就自定义啊!眼睛尖的可能已经看见了,上面的图片中的values-night中除了放有style.xml外还有colors.xml,对,没错,我们只要把颜色信息放入到colors.xml中而后根据需求写上两个颜色就行了。

但仍是建议使用Material Design Components,由于它的颜色主题系统 (例如主题属性?attr/colorSurface?attr/colorOnSurface)能够轻松访问合适的颜色。

“大哥,背景颜色和字体颜色我知道怎么改了,图片呢?图片咋办啊!”

“来了来了,猴急猴急的!”

图片设置其实和颜色差很少,也是两套资源,好比你的drawable文件夹下有一张aaa.jpg的图片,你想在暗黑模式下还称另一张图片,那么你就能够新建一个drawable-night的文件夹,在里面放上你的另一张图片就好了,注意, 图片名称必定要和drawable中的对应。同理,drawable-xhdpi、drawable-xxhdpi就是再建两个文件夹:drawable-night-xhdpi、drawable-night-xxhdpi,而后放入对应图片就好了。

“什么?你想看一下效果?那好吧,如你所愿,这真的是你,要是别人我都不让他看。。。。”

怎么样,效果还能够吧?

应用内修改主题

“我还想本身主动切换,不想随着系统换才换”

“来,你过来,你还想干啥,说,来来来,说吧”

“我就想本身主动设置是否跟随系统切换主题。。。我看好多应用都有这个功能”

哎,既然你发自心里的问了,那我就大发慈悲的告诉你:固然能够哟!

通常来讲应用都会有几个选项供你选择,分别是:普通模式、暗黑模式、跟随系统,对吧?

谷歌也给了咱们这几个选项,能够直接进行设置:

我们刚才所说的就是Light、黑暗和系统预设,省电模式这里就不写, 若是有需求能够进行实验。

切换主题的方法也很简单,直接调用下面方法就行:

AppCompatDelegate.setDefaultNightMode()
复制代码

就一行代码就好了,参数须要传入上面的四种模式之一。

来吧,那就写一下代码吧,按照上面的要求写三个按钮,分别来实现普通模式、暗黑模式和系统模式吧:

override fun onClick(v: View) {
        when(v.id){
            R.id.btnLight ->{
                setDefaultNightMode(MODE_NIGHT_NO)
            }
            R.id.btnDark ->{
                setDefaultNightMode(MODE_NIGHT_YES)
            }
            R.id.btnDefault ->{
                setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM)
            }
        }
    }
复制代码

这个代码应该不须要解释了,上面解释的已经够多了。来看一下实现效果吧:

配置变动

“大哥,我又想了下,若是有的页面正在播放视频,我想要延迟配置更改该怎么办啊?”

“来,你过来小兄弟,逗着大哥玩呢?这一每天的!”

来吧,有需求就得有实现,谷歌大大已经为咱们都想好了,应用能够经过声明每一个Activity能够处理uiMode 配置更改来处理Dark主题自己的实现:

<activity android:name=".MyActivity" android:configChanges="uiMode" />
复制代码

当Activity声明它处理配置更改时,onConfigurationChanged()将在主题更改时调用其方法。

要检查当前主题是什么,应用能够运行以下代码:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // 夜间模式未启用,咱们正在使用浅色主题
    Configuration.UI_MODE_NIGHT_YES -> {} // 夜间模式启用,咱们使用的是深色主题 
}
复制代码

总结

文章到这里基本结束了,谷歌用行动告诉咱们尽可能不要硬编码,出来混都是要还的,硬编码一时爽,一直硬编码一直爽,哈哈哈。喜欢的点赞+关注啊!

相关文章
相关标签/搜索