Android Q 暗黑模式
1、Force Dark
一种能让应用程序快速适配深色主题,Force Dark的工作原理是系统会分析浅色主题应用下的每一层View,并且在这些View绘制到屏幕之前,自动将它们的颜色转换成更加适合深色主题的颜色。注意,只有原本使用浅色主题的应用才能使用这种方式,如果你的应用原本使用的就是深色主题,Force Dark将不会起作用。
右击res目录 -> New -> Directory,创建一个values-v29目录,然后右击values-v29目录 -> New -> Values resource file,创建一个styles.xml文件。接着对这个文件进行编写,代码如下所示:
<resources><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:forceDarkAllowed">true</item></style>
</resources>
除了android:forceDarkAllowed属性之外,其他的内容都是从之前的styles.xml文件中复制过来的。这里给AppTheme主题增加了android:forceDarkAllowed属性并设置为true,说明现在我们是允许系统使用Force Dark将应用强制转换成深色主题的。另外,values-v29目录是只有Android 10.0及以上的系统才会去读取的,因此这是一种系统差异型编程的实现方式。
2、values-night适配
(1)将AppTheme的parent主题指定成了Theme.AppCompat.DayNight.NoActionBar ,这是一种DayNight主题。因此,在普通情况下MaterialTest项目仍然会使用浅色主题,和之前并没有什么区别,但是一旦用户在系统设置中开启了深色主题,MaterialTest项目就会自动使用相应的深色主题
(2)创建values-night目录,增加color.xml
color.xml中的颜色命名与values目录下的color.xml中的命名相同,在普通情况下,系统仍然会读取values/colors.xml文件中的颜色值,而一旦用户开启了深色主题,系统就会去读取values-night/colors.xml文件中的颜色值了。
如果适配图片的话,就创建对应的 drawable-night目录
3、切换主题
黑暗模式和正常模式,无非就是两种主题间的切换(主要是各种背景色,字体颜色和Icon)。因此我们只需要定义两套不同的主题,根据是否是黑暗模式进行主题的切换即可
(1)判断当前是否处于黑暗模式:用于启动时还在不同的主题
//检查当前系统是否已开启暗黑模式public static boolean getDarkModeStatus(Context context) {int mode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;return mode == Configuration.UI_MODE_NIGHT_YES;}
(2)定义两套主题(正常模式和黑暗模式):即在style文件下自定义两个style,但是必须指定parent为‘Theme.AppCompat.DayNight.DarkActionBar’,如下所示:
//正常模式下的主题<style name="main_theme_light" parent="Theme.AppCompat.DayNight.DarkActionBar"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="main_text_color">@color/main_text_color_light</item><item name="main_bg_color">@color/main_bg_color_light</item></style>//黑暗模式下的主题<style name="main_theme_dark" parent="Theme.AppCompat.DayNight.DarkActionBar"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="main_text_color">@color/main_text_color_dark</item><item name="main_bg_color">@color/main_bg_color_dark</item></style>
(3)找出适配黑暗模式需要的属性(主要是颜色属性:背景色、字体颜色和Icon颜色等并给属性赋值),类似如下定义:
<!-- 主要字体颜色--><attr name="main_text_color" format="color" /><!-- 主要背景颜色--> <attr name="main_bg_color" format="color" />//不同模式下的颜色属性值<color name="main_text_color_light">#000000</color><color name="main_text_color_dark">#ffffff</color><color name="main_bg_color_light">#ffffff</color><color name="main_bg_color_dark">#000000</color>
(4)在activity和xml中引用我们自定义的属性:
//在xml文件中使用我们自定义属性
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="?attr/main_bg_color"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="?attr/main_text_color"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
(5)在BaseActivity中切换不同的主题,才能使我们自定义的属性生效,必须在setContentView()方法前设置:
//在BaseActivity中切换不同的主题,才能使我们自定义的属性生效,必须在setContentView()方法前设置:
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {if (getDarkModeStatus(this)) {setTheme(R.style.main_theme_dark);}else {setTheme(R.style.main_theme_light);}setContentView(R.layout.activity_main)}
//为达到更好的适配效果,可在xml文件的activity节点下加入如下属性:
android:configChanges="uiMode
tips:
1、监听深色主题是否开启
1)在清单文件中给对应的Activity配置 android:configChanges=“uiMode”
2)在onConfigurationChanged方法中获取:
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {super.onConfigurationChanged(newConfig);int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;switch (currentNightMode) {case Configuration.UI_MODE_NIGHT_NO:Log.e("=======","=====关闭夜间模式====");// 关闭break;case Configuration.UI_MODE_NIGHT_YES:Log.e("=======","=====开启夜间模式====");// 开启break;default:break;}
}
2、判断深色主题是否开启
public static boolean isNightMode(Context context) {int currentNightMode = context.getResources().getConfiguration().uiMode &Configuration.UI_MODE_NIGHT_MASK;return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
}
3、可以通过Force Dark来自动适配,然后再通过values-night适配来进行图片资源以及颜色等的适配。
Android Q 暗黑模式相关推荐
- android q 桌面模式,Android Q带来全新桌面模式
IT之家3月14日消息 谷歌在美国当地时间3月13日(北京时间14日凌晨)正式推送了Android Q的首个Beta版本,"亲儿子"Pixel系列全系手机可以尝鲜体验这最新的系统. ...
- Android微信暗黑模式的方法,微信“暗黑”模式来了!设置方法拿走不谢
盼望着,盼望着 暗黑模式来啦! 小编问问大家 你们已经更新了吗? 3月上旬,微信方面表示 为了优化用户体验 微信与苹果达成合作 共同探索微信在iOS系统的深色模式体验 目前该功能已完成开发 将有望在下 ...
- Android Q暗色模式适配踩坑—状态栏
暗色模式已经不是什么新鲜玩意了,大家最近看到关于暗色模式最多的内容可能就是iOS版本微信未适配暗色模式面临被AppStore下架的风险.然后今天早上一醒来,发现Android的微信也黑了(因为我手机一 ...
- Android 适配暗黑模式
在样式中添加 <style name="MyAppTheme">.......<item name="android:forceDarkAllowed& ...
- android q pc模式,安卓Q新增原生桌面模式:手机连接显示器变主机 心疼老罗!
去年,锤子科技的创始人罗永浩在坚果R1的发布会上推出了坚果TNT工作站,坚果手机可充当"主机"与坚果TNT组成一个"桌面级电脑".但是坚果TNT工作站并没有如期 ...
- 开启Android Q DarkMode | 开启Android Q深色模式 夜间模式
1.首先下载Image 注意,这里最好是下载google APIs Intel x86 System Image 2.创建虚拟机,启动模拟器 如果报错HAXM 没有安装的话,请安装一下 注意,这个HA ...
- Android App Dark Theme(暗黑模式)适配指南,android实战mysql
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2qd7l5a-1636430548017)(https://user-gold-cdn.xitu.io/2020/3/ ...
- Android App Dark Theme(暗黑模式)适配指南
在 2019 年的 Google I/O 和 Apple WWDC 上,新露面的 Android 10 和 iOS 13 都宣布将支持 Dark Theme 也就是我们常说的暗黑模式,并提供相关 AP ...
- Android webView适配H5暗黑模式
第一步 首先Android 必须是Q 就是10.0才能支持暗黑模式 第二步 设置Android webView暗黑模式 WebViewFeature必须引入这个包 implementation 'an ...
最新文章
- 036_jQuery Ajax全局回调函数
- linux命令0424
- CentOS7中解压tar包的方式安装Nginx
- 编写高性能Web应用程序的10个技巧
- (轉貼) ThinkPad鍵盤設計原理和哲學 (NB) (ThinkPad)
- HierarchicalDataTemplate中的ContextMenu的Command绑定
- 【计算机视觉】人脸识别总结
- 实验九 哈希表的查找操作
- 大学生 计算机 毕业设计 xx管理系统 毕设(1)
- Chrome下载离线安装包的方法
- CCA分析图如何解读_微生物群落与环境因子关联:全自动的CCA/RDA分析流程!!...
- Excel表格中将两个或多个单元格内容合并为一个单元格的内容
- Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
- 灵感来了挡也挡不住,基于Redis解决业务场景中延迟队列
- windows系统bat批处理 电子教室加卡他卡 伽卡他卡学生端暴力关闭 无敌版
- 小白如何快速创建一个属于自己的APP
- UVA_12676_Inverting Huffman(哈夫曼树)
- ASP.NET EXCEL导入,身份证、手机号长度校验数据校验
- 《数据库系统》(四) 概念数据库设计
- 【目标检测】Detection in Crowded Scenes: One Proposal, Multiple Predictions
热门文章
- 怎么集成穿山甲(今日头条广告SDK)
- 个人永久性免费-Excel催化剂功能第71波-定义名称管理器维护增强
- termux使用教程python-Termux折腾记--进阶之python库使用
- 配置Apache+Tomcat+mod_jk软件环境
- 思维模型 乔哈里视窗
- 微信小助手WeChatExtension中文版v1.7.8支持最新版
- IpMsg代码分析(三)
- 运用PyTorch动手搭建一个共享单车预测器
- java抽组件_GitHub - ysc/HtmlExtractor: HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件。...
- 计算机主板和单片机的区别,单片机和工控机的作用和区别