博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

在现在的很多应用中,都有一个夜间模式,由于大部分人玩手机都到深更半夜,白色的主题在夜晚不开灯的情况下,显得屏幕非常亮。一种办法是降低屏幕的亮度,就比如我的手机一般都开起了自动亮度的功能;还有一种办法就是将 App 切换到夜间模式,其实就是改变一下主题颜色。

在 Android support v7 包版本 23 及以后,系统就提供了一种简单而快速的方式,让我们得以很快的切换到夜间模式。接下来,通过一个案例来实现一下。

首先呢,我们建立一个空项目即可,但需要加入两个 package,如下:

相对应的,必须命名为 drawable-night 和 values-night

我们项目默认的主题颜色,也就是日间模式,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#008577</color><color name="colorPrimaryDark">#00574B</color><color name="colorAccent">#D81B60</color><color name="colorCommonText">#5CACEE</color><color name="colorPressedBtnBg">#FF00FF</color><color name="colorCommonBtnBg">#CFCFCF</color>
</resources>

夜间模式,颜色需要换成黑色或深色,比较护眼吧

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#4F4F4F</color><color name="colorPrimaryDark">#363636</color><color name="colorAccent">#828282</color><color name="colorCommonText">#66FF99</color><color name="colorPressedBtnBg">#00FFFF</color><color name="colorCommonBtnBg">#708090</color>
</resources>

以上是 values package 的日间 / 夜间模式的适配,如果在 View 中还有引用到 drawable package 的话,也要做对应的处理。例如,给一个 Button 换样式,日间模式的样式代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/colorPressedBtnBg" android:state_pressed="true" /><item android:drawable="@color/colorCommonBtnBg" android:state_pressed="false" />
</selector>

夜间模式,同样需要

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@color/colorPressedBtnBg" android:state_pressed="true" /><item android:drawable="@color/colorCommonBtnBg" android:state_pressed="false" />
</selector>

到此,差不多就完成了一半。

接下来,就是使用代码去控制日间和夜间两种模式的切换效果了。一般的,这个切换行为是一个 Switch 开关,它的用法其实就和 CheckBox 一样,设置选中状态的变化监听即可。以下是 MainActivity 里的代码:

public class MainActivity extends AppCompatActivity {private SharedPreferences mSharedPreferences;private Switch sw_night_mode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {sw_night_mode = (Switch) findViewById(R.id.sw_night_mode);mSharedPreferences = getSharedPreferences("app_night_mode", MODE_PRIVATE);boolean isNightMode = mSharedPreferences.getBoolean("night_mode", false);if (isNightMode) {sw_night_mode.setChecked(true);} else {sw_night_mode.setChecked(false);}sw_night_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (isChecked && !isNightMode) {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);mSharedPreferences.edit().putBoolean("night_mode", true).apply();} else if (!isChecked && isNightMode) {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);mSharedPreferences.edit().putBoolean("night_mode", false).apply();}startActivity(new Intent(MainActivity.this, MainActivity.class));overridePendingTransition(R.anim.night_mode_open_anim, R.anim.night_mode_close_anim);finish();}});}
}

这里需要注意的一个点:因为我们在切换模式之后,需要先关闭当前 Activity,然后启动它。这个过程需要保存一下 Switch 被选中的状态,否则每一次打开 Activity 的时候,都默认没有被选中,就会造成切换不回来日间模式的问题。

还有一个问题,就是 Activity finish 了,然后在 start 会有一点生硬,这个可以用过渡动画来解决,一个是打开 Activity 动画:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="500"android:fromAlpha="0"android:interpolator="@android:anim/accelerate_interpolator"android:toAlpha="1.0" />

关闭 Activity 的动画:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:duration="500"android:fromAlpha="1.0"android:interpolator="@android:anim/accelerate_interpolator"android:toAlpha="0" />

这里也需要注意一点,overridePedingTransition() 方法需要在 startActivity 之后调用,否则动画没有效果。

最后,来看看效果吧

到此为止,就搞定了一个简单快速夜间模式切换了。

如果需要保存当前的夜间模式,上面的操作是无法进行保存的,如果 App 被杀死的话,下次再进入则还是日间模式。所以,在 Activity 的 onCreate 方法之前,就应该去判断一下当前的模式,代码如下:

    @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {mSharedPreferences = getSharedPreferences("app_night_mode", Context.MODE_PRIVATE);if (mSharedPreferences.getBoolean("night_mode", false)) {getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);} else {getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);}super.onCreate(savedInstanceState);}

这样的话,就会还原用户上一次保存的模式了。

一种简单快速的方式实现 Android App 的夜间模式相关推荐

  1. 一种简单快速有效的低照度图像增强方法

    一种简单快速有效的低照度图像增强方法 一.本文介绍的是一种比较实用并且去阴影效果很好的方法,选自2004年Tao的一篇论文,名称是<An Integrated Neighborhood Depe ...

  2. 一种简单快速有效的图像暗部增强/亮度均衡算法

    2020/10/27更新:之前为克服光晕效应尝试过引导滤波,惜哉其他地方犯了个小错误以致未达到目标,处理的结果虽然保边但却过于模糊.后期修正之后再次尝试便得到了预期的效果.现将引入了引导滤波去光晕的程 ...

  3. 5种简单快速的方法解除PDF文件密码保护

    PDF 文件已经成为了我们日常工作.学习中广泛使用的文档格式之一.为了对重要的 PDF 文件进行保护,我们有时需要添加密码保护功能来防止未授权访问或修改.但是,如果您的 PDF 文件已经有了密码保护, ...

  4. android 层级边框,有没有一种简单的方法可以在Android视图的顶部和底部添加边框?...

    有没有一种简单的方法可以在Android视图的顶部和底部添加边框? 我有一个TextView,我想沿其顶部和底部边框添加黑色边框. 我尝试将android:drawableTop和android:dr ...

  5. android menu夜间模式,Android常用技巧夜间模式开发浅析

    前言 Android的夜间模式主要主用于阅读方面,在QQ,微信读书,新闻阅读类一般会有相应的功能,本文主要介绍整体APP的夜间模式以及webview中夜间模式的实现. 效果图展示 功能实现简介 APP ...

  6. android 夜间模式蒙板,常见APP的夜间模式梳理和设计方法

    本文笔者将对一些APP的夜间模式进行分析,总结夜间模式常见的切换方式,以及从简单到复杂的几种夜间模式设计方法. 一.夜间模式的由来和作用 最早应该是智能手机的普及大大延迟了人们的睡眠时间,大家都习惯晚 ...

  7. 统计学中几种简单的检验方式

    1.零假设 首先假定零假设成立,然后求出某统计量达到如此极端的概率是多少 定义零假设,如果得到的值大于表上的值,则出现零假设的概率很小,则拒绝零假设 2.假设检验 2.1.T检验 t检验主要用于样本含 ...

  8. android 8.1 夜间模式,android 快速实现夜间模式

    最近项目中遇到了一个问题,夜间模式在8.0以上的手机中不起作用,查看了一下原因,是夜间模式实现方法的问题.分两种情况介绍一下 先看一下运行效果: 第一种 是目前项目中用到的,是以前的开发人员写的,存在 ...

  9. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

最新文章

  1. laravel 中间件不生效_laravel中间件实战(luke)
  2. 码农也来玩奥运开幕式“超级变变变”!相机动捕,实时转换赛事图标,项目开源可试玩...
  3. html5显示字幕信息,HTML5 Placeholder实现input背景文字提示效果
  4. 求序列中第k小的数_无理数的整数部分与小数部分
  5. arm汇编解析—qnnpack卷积实现
  6. 新安装的mysql登录不了_mysql 5.6 新安装登录
  7. [UE4] 通过 Git 进行版本控制时的报错 No assets to check in! 的解决方法:重新更改本地代码
  8. 1129 Recommendation System
  9. 蓝桥杯2016年第七届C/C++省赛B组第一题-煤球数目
  10. 云承软件和云溪哪个好_诺承木工开料机使用什么软件好
  11. 凯恩帝k1000ti参数设置_凯恩帝公司K1000T系统用户手册.pdf
  12. 优化 RTD 温度传感系统:接线配置
  13. BZOJ 1050 旅行comf
  14. android指南针报告,Android 指南针
  15. 在WeChat上搭建ChatGpt机器人
  16. 7485设计8位比较器
  17. JavaScript简介及JavaScript中的关键保留字、变量和数据类型
  18. java秋招面试攻略
  19. burp如何设置微信小程序代理
  20. 声网在线教育解决方案全面升级,提供8大场景+最稳实时互动课堂

热门文章

  1. 类似爱美刻 右糖 轻剪辑 捷映 秀展网 秀多多 来画 创视网 传影 影大师 闪剪源码 技术源头 二次开发 提供源码 逗拍 趣推 飞推 美册 搞定视频 简影 剪影 爱字幕 幸福相册 八角星
  2. C/C++版本更迭历程
  3. Oracle提示TNS:无监听程序的解决办法
  4. 临床病理的计算机辅助读片,第二军医大学附属长海医院病理科
  5. 验证(Verification)与确认(Validation)的区别
  6. 新概念二-非谓语动词
  7. Win PE CD-ROM 制作简介(系统修复光盘)
  8. 免费网络电话App 席卷移动互联网市场
  9. excel表格如何转换成word表格_pdf的表格怎么转换成word?教你掌握重要一步
  10. 【C语言】总体脉络-知识框架