暗黑模式?安卓适配一波

暗黑形式?安卓适配一波

前语

第一次听到暗黑形式的时候,感觉好酷啊,听着就美观(也不知道我怎样听出来的)。苹果在前几年就有暗黑形式的风声,好像是在IOS11、IOS12的时候就说要推出了,成果愣生生等到了IOS13暗黑形式才推出。IOS13推出到现在现已大半年了,体系运用没得说,完美适配,三方运用也都连续支撑了暗黑形p ^ # Q式,就连微信在前段时间的更新中也完成了暗黑形式,先来欣赏下微信的暗黑形式吧!

正文

已然苹果完成了暗黑形式,那么安卓 2 z v f ^ & n肯定不能落下啊,所以在安卓10(Q API等级29)中支撑了暗w n Y黑形式,不过官方的叫法为Dark theme,怎样翻译都行,先来看一下官方对暗黑形式的界说吧:

这儿就不一行行翻译了,主要来说一下暗黑形式的优点吧:

  • 手机的屏幕现在大部分都现已晋级成了OLED屏幕(当然还有一部分手机仍是LCD屏幕),OLED屏幕显示黑色的时候不会发光,能够大大减小功耗。
  • 提高了弱视用户和对强光敏感的用户的可见性。
  • 使任何人P 1 k i p q n在暗淡的环境中都更简单运用设备。

怎样敞开暗黑形式就不多说了,手机厂商不同,敞开方式不同,各大$ Z 1 J w C手机厂商魔改的R A ! C g体系有时候真的找不到在哪设置,那就百度一下吧。

设置暗黑主题

为了支撑Dark主题,有必要将运用的主题设置为继承自DayNight主题(res/values/styles.xml):

<styl. / c ! 2 k te name="AppTheme" parent="Theme.AppR R 5 T 7 L !Compat.DayNight">

还能够运用 MaterialComponents的深色主题:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">X H C t  ! n .

这会将运用程序的主主题与体系控制的夜间形式标志相关C 4 % o O R联,并为运用程序提供默认的深色主题(启用时)。 h L e ! X当体系的主题切换时,运用也会随之切换主题。

“这就完了u 0 1?”

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

“那我假如想要自界说主题呢?”

咱们日( 9 6 } q * @ ` &常开发中肯定会有这种需求,官方界说的主题不完万能满足咱们的需求,这时候就需要来自界说主题了,谷歌也为咱们想到了这一点。一般J * ? e b形式下咱们不需| } ! h要动,该怎样写怎样写@ c 0 i s J T #,然后在res下再新建一个values-night的文件夹,然后把你自界说的放进去,name起成和styles) 3 ~ R p D E g.xml中对应的主题称号就能够了。来看一下吧:

这样设置完就OK了。

“不对啊,这c m z 4 b ( ^ e q仅仅主题变了,那我的Activity的布景、字体的色彩、图片等等该怎样9 4 # f J ) I u办呢?”

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

这儿必定要留意,主题和样式应避免在淡色主题下运用硬编码的色X 7 D } # 8彩或图标,应该运用主题特点(首m ) 3 U l i选)或夜间限定的资源。来了解下两个最重要的主题特点吧:

  • ?android:attr/textColorPrimary这是一种通用的文本色彩。淡色主题为近黑色,深色主题为近Z ^ R 3 + b 1 S B白。它包含禁用状况。
  • ?attr/colorControlNormal通用图标Z : i H t Y B F色彩。它包含禁用状况。

当然肯定不是有必要要运用上面官方f U W *提供的两个主题特点,想自) s u i G : N f界说就自界说啊!眼睛尖的可能现已看见了,上面的图片中的values-night中除了放有style.xml外还有colors.xml,对,没错,咱们只要把色彩信息放入到colors.xml中然后依据需求写上两个色彩就好了。

A ? w 9 T @ ? #仍是主张运用Material Design Components,因为它的色彩主题体系 (例如主题特点?atq y 1 F [ +tr/cq R 2olorSurface?attr/colorOnSurface)能够轻松访问适宜的色彩。

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

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

图片设置其实和色彩差不多,也是两套资源,比方你的drawabb 0 e ale文r . U H G m h m `~ = y夹下有一张aaa.jpg的图. * m ? ; , c片,你想在暗黑形式下还称别的一张图片,那么你就能够新建一个drawable-night的文件7 n { d U s I g夹,在里V e s `面放上你的别的一张图片就行了,留意, 图片称号必定要和dra^ o l a L 7wable中的对应。同理,drawable-xhdpi、drawable-xxhdpi便是再建两个文件夹:drawable-night-xhdpi、drawable-night-xxhdpi,然后放入对应图片就行了。

“什么?你想看一下作用?那好吧,如你所愿V J G,这真的是你,要是他人我都不让他看。。。。”O n 3 l W

怎样样,作用还能够吧?w K W 9 L 6

运用内修改主题

“我还想自己自动切换,不想跟着体M u W 3系换才换”

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

“我就想自己自动设置是否跟从体系切换主题。。。我看好多运用都有这个功用”

哎,已然你发自内心的问了,那我就大发慈悲的告知你:当然能够哟!

一般来说运用都会有几个选项供你挑选,分别是:一般形式、暗黑形式、跟从体系,对吧?

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

  • LightMODE_NIGHT_NO
  • 漆黑-` 8 w ^ MODE_NIGHT_YE[ M Y l u B { ^S
  • 由省电形式设定- MODE_NIGHT_AUTO_BATTERY
  • 体系预设1 B R c V x J ?MODE_= ; { M t {NIGHT_FOLLOW_SYSTEM

咱们方才所说的便是Light、漆黑和体系预设,省电形式这儿就不写, 假如有需求能够进行试验。

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

AppCompatDelegate.setDefaultNightMode()

就一行代码就行了,参数需要传入m $ ~ 3 ) ,上面的四种形式之一。

来吧,那就写一下代码吧,依照上面的要求写三个按钮,分别来完成一般形式、暗黑形式和体系形式吧:

   override fun onClick(v: View) {
when(v.id){
R.id.btnLight ->{
setDefaultNightMw G dode(MODE_NIGHT_NO)
}
R.W p Y 6 0 U n Z did.btnDark ->{
setDefaultNightModeU T % h 5 v [ ` j(MODE_NIGHT_YES)
}
R.id.btnDefault -b # ; { 7 e = ]>{
setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM)
}
}
}

这个代码应该不需要解说了,上面解说的现已够多了。来看一下完成作用吧:

O B a –备改变

“大哥,我又想了下,假如有的页面正在播放视频,我想要延迟装备更改该怎样办啊?”

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

来吧,有需求就得有完成,谷歌大大现已为咱们都想好了k e u,运用能够通过声明每个Activity能够处理uiMode 装备更改来处理Dark主题本身的完成:

&l_ u U l 0t;activity
android:name=".MyActivity"
android:configChanges="uiMode" />

当Activity声明它处理装备更改时,onConfigurationChanged()将在主题更改时调用其办法。

A W h检查当时主题是什么,运用能够运行如下代码:

val currentNightModeh G B A = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (curre- 3 zntNightMode) {
Configuration.UI_MODE_NIGHT_NO -> {} // 夜间形T S , C A a式未启用,咱们正在运用淡色主题
Configuration.UI_MODE_NIGHT_6 h C $ Z H LYES3 1 w _ R o Q -> {} /} G G : 8 G 2 b/ 夜间形式启用,咱们运用的是深色主题  
}

总结

文章到这儿基本完毕了,谷歌用行动告知咱们尽量不要硬编码,出来混都是要还的,硬编码一时爽,一向硬编码一向爽,哈哈哈。喜欢的点赞+关注啊!