夜间模式

Android夜间模式调研总结 本文总结了Android现在比较常用的实现夜间模式的方案,主要方案有主题切换、换肤、Resources hack、Android UIMode等实现方式。 阅读详情


一、使用 setTheme 方法

在 colors.xml 中定义两组颜色,分别表示日间和夜间的主题色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <color name="nightColorPrimary">#3b3b3b</color>
    <color name="nightColorPrimaryDark">#383838</color>
    <color name="nightColorAccent">#a72b55</color>
</resources>

之后在 styles.xml 中定义两组主题,也就是日间主题和夜间主题:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

//夜间主题
<style name="NightAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/nightColorPrimary</item>
    <item name="colorPrimaryDark">@color/nightColorPrimaryDark</item>
    <item name="colorAccent">@color/nightColorAccent</item>
    <item name="android:textColor">@android:color/white</item>
    <item name="android:background">#303030</item>
    <item name="mainBackground">@color/nightColorPrimaryDark</item>
</style>

在主题中的 mainBackground 属性是我们自定义的属性,用来表示背景色:
<resources>
    <attr name="mainBackground" format="color|reference"></attr>
</resources>

最后就是 MainActivity 的代码:
public class MainActivity extends AppCompatActivity {

 // 默认是日间模式
 private int theme = R.style.AppTheme;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 // 判断是否有主题存储
  if(savedInstanceState != null){
   theme = savedInstanceState.getInt("theme");
   setTheme(theme);
  }
  setContentView(R.layout.activity_main);
 
  Button btn_theme = (Button) findViewById(R.id.btn_theme);
  btn_theme.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    theme = (theme == R.style.AppTheme) ? R.style.NightAppTheme : R.style.AppTheme;
    MainActivity.this.recreate();
   }
  });
 }
 
 @Override
 protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putInt("theme", theme);
 }
 
 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  theme = savedInstanceState.getInt("theme");
 }
}

二、使用 Android Support Library 中的 UiMode 方法
下面是 values/colors.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="textColor">#FF000000</color>
    <color name="backgroundColor">#FFFFFF</color>
    <color name="windowBackground">#fff</color>
</resources>
除了 values/colors.xml 之外,我们还要创建一个 values-night/colors.xml 文件,
用来设置夜间模式的颜色,其中 <color> 的 name 必须要和 values/colors.xml
中的相对应:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3b3b3b</color>
    <color name="colorPrimaryDark">#383838</color>
    <color name="colorAccent">#a72b55</color>
    <color name="textColor">#FFFFFF</color>
    <color name="backgroundColor">#3b3b3b</color>
    <color name="windowBackground">#000</color>
</resources>
在 styles.xml 中去引用我们在 colors.xml 中定义好的颜色:
<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColor">@color/textColor</item>
        <item name="mainBackground">@color/backgroundColor</item>
        <item name="android:windowBackground">@color/windowBackground</item>
    </style>
在 MyApplication 中先选择一个默认的 Mode :
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 默认设置为日间模式
        AppCompatDelegate.setDefaultNightMode(
                AppCompatDelegate.MODE_NIGHT_NO);

    }
}

要注意的是,这里的 Mode 有四种类型可以选择:

    1、MODE_NIGHT_NO: 使用亮色(light)主题,不使用夜间模式;

    2、MODE_NIGHT_YES:使用暗色(dark)主题,使用夜间模式;

    3、MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题;

    4、MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为 MODE_NIGHT_NO

当用户点击按钮切换日/夜间时,重新去设置相应的 Mode :

public class MainActivity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView)findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                getDelegate().setLocalNightMode(currentNightMode == Configuration.UI_MODE_NIGHT_NO
                        ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO);
                // 同样需要调用recreate方法使之生效
                recreate();
            }
        });
    }
}

ps:

1.colorPrimary 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色

2.colorPrimaryDark 应用的主要暗色调,statusBarColor默认使用该颜色

3.statusBarColor 状态栏颜色,默认使用colorPrimaryDark

4.windowBackground 窗口背景颜色

5.navigationBarColor 底部栏颜色

6.colorForeground 应用的前景色,ListView的分割线,switch滑动区默认使用该颜色

7.colorBackground 应用的背景色,popMenu的背景默认使用该颜色

8.colorAccent CheckBox,RadioButton,SwitchCompat等一般控件的选中效果默认采用该颜色

9.colorControlNormal CheckBox,RadioButton,SwitchCompat等默认状态的颜色。

10.colorControlHighlight 控件按压时的色调

11.colorControlActivated 控件选中时的颜色,默认使用colorAccent

12.colorButtonNormal 默认按钮的背景颜色

13.editTextColor:默认EditView输入框字体的颜色。

14.textColor Button,textView的文字颜色

15.textColorPrimaryDisableOnly RadioButton checkbox等控件的文字

16.textColorPrimary 应用的主要文字颜色,actionBar的标题文字默认使用该颜色

17.colorSwitchThumbNormal: switch thumbs 默认状态的颜色. (switch off)

Android实现夜间模式切换功能 许多APP现在已经有夜间模式(也有的叫做护眼模式),它可以一键将应用从浅背景色、深前景色切换到深背景色、浅前景色的模式,不仅夜间护眼,还有省电的功效。但以往这些只是APP自己开发的功能,而从 Android Q 开始,夜间模式成为一个全局设置,用户只需下滑呼出快捷设置菜单,开启夜间模式,整个 Android 操作系统界面和支持夜间模式的APP都会自动变成统一的深色风格。values-night文件中的代码是在values文件的基础上修改的,在下方进行对比。values-night中的colors.xml。 阅读详情

相关推荐

夜间模式(源码)

夜间模式(源码),可以调节亮度,灰度,保护视力

一键切换暗黑模式,这些代码片段你不可错过

如今,许多网站设计师都会为用户提供浅色和深色模式的选择。这不仅仅是为了美观,更是为了提高网页的可访问性,尤其是对视力有障碍的用户来说,深色模式更友好。让用户自由切换自己喜欢的模式,是提升用户体验的关键。为网站提供深浅模式切换,不仅提升美观,还改善用户体验,尤其对有视觉障碍的用户有帮助。通过 CSS 和 JavaScript,可以轻松实现这个功能。上述8个代码片段展示了如何优雅地切换模式,既美观又实用,能有效提升网站的可用性和用户满意度。

m0_45522371的博客 1236

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 613

护眼色的RGB值 和 颜色代码

在搜索引擎搜“护眼色”,就会搜出一堆关于保护眼睛的屏幕颜色文章,说的统统是一种颜色,有点像绿豆沙的颜色。方法就是在屏幕设置里。 色调: 85; 饱和度: 123; 亮度: 205; R: 199; G: 237; B: 204; 颜色代码是: #C7EDCC https://jingyan.baidu.com/article/d...

底层码农 2万+

基因家族Motif 分析

MEME

hgz2020的博客 6317

从时序参数到电压供给:TTL(RGB)液晶屏驱动调试全解析

本文全面解析TTL(RGB)液晶屏驱动调试的关键技术,从时序参数配置到电压供给系统搭建,详细介绍了同步信号参数、寄存器配置技巧以及升压电路设计。通过实战案例和常见故障分析,帮助工程师快速掌握液晶显示屏调试方法,提升开发效率。

weixin_30588675的博客 247

常用背景色RGB数值

【转自】

boyemachao的专栏 7851

卸载Office 16 Click-to-Run Extensibility Component详细步骤

卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component

M_try的博客 3万+

科研最合适的护眼色

科研背景色

weixin_44897685的博客 2032

电子货架标签应用浅析(ESL)

​【 关注与分享,是对原创最大的鼓励 】 年底了,会断续介绍几个主要的BLE的应用及市场情况,这篇文章介绍的是电子货架标签, ESL (Electronic Shelf Label)。 文章将从应用简介,市场规模,产业链,头部玩家及系统框架进行介绍。只对技术感兴趣的可以直接拉到底。 ESL简介 ESL,是一种显示产品,其主要是替代传统的纸质标签,应用于大型商超,...

iotthings的博客 4691

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 705

夜间模式 颜色值参考

weixin_40046130的博客 6807

STM32cubeMX配置FreeRTOS软件定时器

文章目录前言1.软件定时器概述一.软件定时器特性二、使用cubeMX生成软件定时器总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。 1.软件定时器概述 一.软件定时器特性 软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期 (period)。 指定类型定时器有两种类型: 1.一次性 这类定时器启动后,它的回调函

m0_49476241的博客 6949

Android夜间模式的简单实现

Android 6.0以后系统提供了AppCompatDelegate用来实现夜间模式和日间模式的切换,AppCompatDelegate中存在以下几种模式: AppCompatDelegate.MODE_NIGHT_YES:设置夜间模式 AppCompatDelegate.MODE_NIGHT_NO:设置日间模式 AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:跟随系统设置决定是否设置夜间模式 AppCompatDelegate.MODE_NIGHT_AUTO

xuzhb 6450

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android studio夜间模式,android studio怎样实现夜间模式

满意答案noxlqub2016.05.01采纳率:51%等级:7已帮助:210人关于阅读类的app,有个夜间模式真是太重要了。那么有两种方式可以实现夜间模式1:修改theme,重启activity优点:正儿八经的夜间模式,配色看着舒服缺点:图片刺眼、闪屏2:使用一个带黑色带透明度的View,盖在现有的activity上,效果类似你带上墨镜,看着太阳不刺眼。优点:不用重启activity,不...

weixin_35709128的博客 2004

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

js 实现夜间模式

<a href="JavaScript:void(0);" id='black1'>夜间模式</a> <script> $("#black1").click(function(){ var s = $(this).html(); if (s=="夜间模式") { $('body').css("background-color","black"...

书写人生 4189

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android 夜间模式

自7.0开始谷歌提供了夜间模式,用于将屏幕色彩调成较为柔和的琥珀色,但因该模式需要硬件的支持,所以不是所有设备上都可用,也不常见。 相关代码: \frameworks\base\services\core\java\com\android\server\display\NightDisplayService.java \frameworks\base\core\java\com\android\i...

搬砖的老牛 2120

Android夜间模式原理

先看一个设置夜间模式的demo。 首先看MainActivity的代码: public class MainActivity extends Activity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layo

kanglupeng的专栏 1800

android夜间模式Support Library

1、引入support包2、让我们项目的主题继承夜间模式主题,在style中设置如下主题:3.新建drawable-night和values-night的资源目录。values-night目录下新建和存放与夜间模式相关的value文件。drawable文件夹放日间模式图片,drawable-night文件夹放夜间模式图片。value的color文件夹设置日间模式颜色,value-night的color文件夹设置夜间模式颜色。

2301_76352508的博客 962

android自动夜间模式吗,Android夜间模式的实现方案

原标题:Android夜间模式的实现方案作者简介本篇来自 Sunlight1024的投稿,详细地讲解了关于Android应用的夜间模式的实现,希望大家喜欢!Sunlight1024的博客地址:http://blog.youkuaiyun.com/qq_20521573前言对于一款阅读类的软件,夜间模式是不可缺少的。最初看到这个需求时候觉得无从下手,没有一点头绪。后来通过查阅资料发现 Android 官方在 S...

weixin_31968831的博客 808

android 夜间模式设置

夜晚的故事(android夜间模式实现) 字数2003 阅读1393 评论11 喜欢18 夜幕降临,他走在马路上,回想着今天发生的一切,他不敢相信事情就这样发生了。他最终还是决定拨打那个电话,掏出手机,解锁屏幕,突然一道强光从屏幕里毫无预兆的发射出来。他一个踉跄倒在了马路中央。而他身后伴随着的是一阵刺耳的刹车声。 手机被摔在一边,屏幕停留在拨号页面,白茫茫的页面。很显然,所谓

rongbinjava的博客 4894

Android 夜间模式(白/夜间模式的切换)

在项目研发中,我们避免不了需求中会应用到夜间模式,这里对它做一些总结以及封装 从API 23后,Android就有自带的api能够实现夜间模式与白天模式的切换。 Support Library 23.2(应用于API14+)推出了适合Android Apps的DayNight主题。 废话不多说,看效果: 最后给大家把主要的部分拿出来,供大家参考,结尾有项目下载地址 1. 导入依赖 implementation 'androidx.appcompat:appcompat:1.0.2' 2.修改...

拉莫帅的博客 1万+

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

本文笔者将对一些APP的夜间模式进行分析,总结夜间模式常见的切换方式,以及从简单到复杂的几种夜间模式设计方法。一、夜间模式的由来和作用最早应该是智能手机的普及大大延迟了人们的睡眠时间,大家都习惯晚上躺在被窝里看一会手机才能睡着。但是关了灯之后手机屏幕的亮度就会特别刺眼,由于绝大多数APP页面背景色都是浅色系,与周围环境的亮度对比比较大,导致手机屏幕和白天一样的亮度就会感觉十分刺眼,所以一些产品开始...

weixin_39675926的博客 992

轻松实现夜间模式

夜间模式的简单实现

WHCZKL的博客 925

各平台支持夜间模式的PDF软件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34236869的博客 5261
上一篇: 利用OnScrollListener.设置Listview的滑动监听
下一篇: 上传头像
得不到的都释怀
博客等级 码龄9年 5粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值