Dark/Light Mode in Android
2019-10-24 本文已影响0人
鹈鹕醍醐
IOS13最近更新加入了深夜模式,carplay也跟着更新了,应用可以设置为跟随系统设置 自动调整light/dark模式。其实这种功能各大app都自己做过,但都是单打独斗跟系统无关。于是找了安卓相关sample,顺便记下
实现流程:
- 必须集成:
androidx.appcompat:appcompat:1.1.0
,可选集成:com.google.android.material:material:1.1.0-beta01
,material即androidX之前的supportDesign - 在res文件夹下新建values-night目录,目录内新建colors.xml。
- app主题继承自
Theme.MaterialComponents.DayNight
或者Theme.AppCompat.DayNight
- 任何地方对颜色的引用都不要 hardcode,而是引用color实现,需要跟随dark/light改变颜色的确保在values-night和values都能找到定义的位置
- 设置api为:AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_TYPE)
- 如果当前activity不适合改变dark/light模式,可在Manifest添加
android:configChanges="uiMode"
,然后设置监听onConfigurationChanged
override fun onConfigurationChanged(newConfig: Configuration) { val currentMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK 今日头条是先开启一个太阳/月亮的动画,动画结束后重绘 when(currentMode){ Configuration.UI_MODE_NIGHT_YES->{ Log.e(localClassName,"DARK mode") recreate() or define your code } Configuration.UI_MODE_NIGHT_NO ->{ Log.e(localClassName,"day mode") recreate() or define your code } } super.onConfigurationChanged(newConfig) }
编译版本要求:
-
compileSdkVersion建议采用最新29,targetSdkVersion建议28或更高。国内应用商店一般都会参考Google Play对APP提交商店时的targetSdkVersion要求:
开始日期 API 级别要求 限制说明 2018 年 8 月 1 日 Android 8.0(API 级别 26) 新应用必须符合 2018 年 11 月 1 日 Android 8.0(API 级别 26) 应用更新必须符合 2019 年 8 月 1 日 Android 9(API 级别 28) 新应用必须符合 2019 年 11 月 1 日 Android 9(API 级别 28) 应用更新必须符合 -
可用于调整dark/light模式的几个关键常量
名称 API 级别要求 说明 MODE_NIGHT_FOLLOW_SYSTEM api-29 跟随系统 MODE_NIGHT_AUTO_BATTERY 无 跟随低电量模式 MODE_NIGHT_AUTO_TIME 无 跟随日出日落时间 MODE_NIGHT_NO 无 强制Light模式 MODE_NIGHT_YES 无 强制Dark模式 MODE_NIGHT_AUTO_BATTERY 调整的阈值是设备出现低电量弹窗时的电量,当设备启用低电量模式时启动深色主题,否则启动浅色主题。
MODE_NIGHT_AUTO_TIME 需要根据当前网络定位或者GPS定位位置才可计算得出精确的日出日落时间。app必须具有定位权限(运行时权限),如果位置为空则直接根据当前时间是否在6-22点判断