日夜间模式的切换

一招切换日/夜间模式:Pixso 2.0变量系统实现主题切换设计实战 如上图对比表所示,相比于传统的手动切换页面风格、修改颜色样式,Pixso变量系统不仅可以快速解决视觉风格切换,还从根本上解决了样式不统一、维护成本高的问题。如果你还没有上手,不妨试着从“日/夜间模式切换”这个场景开始练手,真正感受变量在实战中的作用。 阅读详情

看了网上那么多日夜间模式切换的方法,大概来说就3种吧!不过最好的一种便是通过反射来实现~
参考链接:http://yuqirong.me/2016/09/08/对于Android日夜间模式实现的探讨/

1:在values文件夹下的colors.xml里添加:

<color name="textColor">#3b3b3b</color>
<color name="textColor_night">#FFFFFF</color>
<color name="backgroundColor">#FFFFFF</color>
<color name="backgroundColor_night">#3b3b3b</color>

2:创建Theme管理类

package com.example.administrator.demo.view;

import android.content.Context;
import android.content.res.Resources;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

public class ThemeManager {
    // 默认是日间模式
    private static ThemeMode mThemeMode = ThemeMode.DAY;
    // 主题模式监听器
    private static List<OnThemeChangeListener> mThemeChangeListenerList = new LinkedList<>();
    // 夜间资源的缓存,key : 资源类型, 值<key:资源名称, value:int值>
    private static HashMap<String, HashMap<String, Integer>> sCachedNightResrouces = new HashMap<>();
    // 夜间模式资源的后缀,比如日件模式资源名为:R.color.activity_bg, 那么夜间模式就为 :R.color.activity_bg_night
    private static final String RESOURCE_SUFFIX = "_night";

    /**
     * 主题模式,分为日间模式和夜间模式
     */
    public enum ThemeMode {
        DAY, NIGHT
    }

    /**
     * 设置主题模式
     */
    public static void setThemeMode(ThemeMode themeMode) {
        if (mThemeMode != themeMode) {
            mThemeMode = themeMode;
            if (mThemeChangeListenerList.size() > 0) {
                for (OnThemeChangeListener listener : mThemeChangeListenerList) {
                    listener.onThemeChanged();
                }
            }
        }
    }

    /**
     * 根据传入的日间模式的resId得到相应主题的resId,注意:必须是日间模式的resId
     * 日间模式的resId
     * 相应主题的resId,若为日间模式,则得到dayResId;反之夜间模式得到nightResId
     */
    public static int getCurrentThemeRes(Context context, int dayResId) {
        if (getThemeMode() == ThemeMode.DAY) {
            return dayResId;
        }
        // 资源名
        String entryName = context.getResources().getResourceEntryName(dayResId);
        // 资源类型
        String typeName = context.getResources().getResourceTypeName(dayResId);
        HashMap<String, Integer> cachedRes = sCachedNightResrouces.get(typeName);
        // 先从缓存中去取,如果有直接返回该id
        if (cachedRes == null) {
            cachedRes = new HashMap<>();
        }
        Integer resId = cachedRes.get(entryName + RESOURCE_SUFFIX);
        if (resId != null && resId != 0) {
            return resId;
        } else {
            //如果缓存中没有再根据资源id去动态获取
            try {
                // 通过资源名,资源类型,包名得到资源int值
                int nightResId = context.getResources().getIdentifier(entryName + RESOURCE_SUFFIX, typeName, context.getPackageName());
                // 放入缓存中
                cachedRes.put(entryName + RESOURCE_SUFFIX, nightResId);
                sCachedNightResrouces.put(typeName, cachedRes);
                return nightResId;
            } catch (Resources.NotFoundException e) {
                e.printStackTrace();
            }
        }
        return 0;
    }

    /**
     * 注册ThemeChangeListener
     */
    public static void registerThemeChangeListener(OnThemeChangeListener listener) {
        if (!mThemeChangeListenerList.contains(listener)) {
            mThemeChangeListenerList.add(listener);
        }
    }

    /**
     * 反注册ThemeChangeListener
     */
    public static void unregisterThemeChangeListener(OnThemeChangeListener listener) {
        if (mThemeChangeListenerList.contains(listener)) {
            mThemeChangeListenerList.remove(listener);
        }
    }

    /**
     * 得到主题模式
     */
    public static ThemeMode getThemeMode() {
        return mThemeMode;
    }

    /**
     * 主题模式切换监听器
     */
    public interface OnThemeChangeListener {
        /**
         * 主题切换时回调
         */
        void onThemeChanged();
    }
}

3:Activity中使用

package com.example.administrator.demo.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;

import com.example.administrator.demo.R;
import com.example.administrator.demo.view.ThemeManager;

public class MainActivity extends Activity implements ThemeManager.OnThemeChangeListener{
    private Button day_night_mode;
    private RelativeLayout relativeLayout;
    private boolean isDay = true;//默认是日间模式
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ThemeManager.registerThemeChangeListener(this);
        day_night_mode = (Button) findViewById(R.id.day_night_mode);
        relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
        day_night_mode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isDay==true){
                    ThemeManager.setThemeMode(ThemeManager.ThemeMode.NIGHT );
                    day_night_mode.setText("日间模式");
                    isDay=false;
                }else {
                    ThemeManager.setThemeMode(ThemeManager.ThemeMode.DAY );
                    day_night_mode.setText("夜间模式");
                    isDay=true;
                }
            }
        });
    }

    @Override
    public void onThemeChanged() {
        //日间模式下的颜色
        day_night_mode.setTextColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.textColor)));
        relativeLayout.setBackgroundColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.backgroundColor)));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ThemeManager.unregisterThemeChangeListener(this);
    }
}
Android日夜间模式切换实战项目详解 现代移动应用在不同光照环境下为用户提供舒适的视觉体验已成为标配功能之一。Android系统的日夜间模式切换不仅提升了可读性和护眼效果,也体现了产品对用户个性化需求的深度理解。本章将从人机交互角度剖析日夜间模式的设计初衷,探讨其在提升用户体验、降低视觉疲劳以及增强界面一致性的关键作用。同时,分析主流App中该功能的实际应用场景,揭示自动适配与手动控制之间的平衡设计原则,为后续技术实现奠定理论基础。 阅读详情

相关推荐

Keil C51里用printf打印数据,为啥总出乱码?手把手教你%bd、%hd、%ld的正确用法

本文深入解析Keil C51中printf打印数据出现乱码的根本原因,并提供格式符%bd、%hd、%ld的正确用法指南。通过详细的调试技巧和实战案例,帮助开发者解决串口输出问题,提升单片机开发效率。

weixin_26854829的博客 281

Android最简单实现日夜间模式切换

如果你用的是Android studio开发,则先把Android工程切换为Project,在你的项目下的res目录下创建一个values-night文件夹,并在这个文件夹下创建colors.xml文件,代码如下 <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</colo

王志伟的博客 5443

GNSS差分码偏差(DCB)从原理到实战:如何避免数据处理中的常见错误

本文深入解析GNSS差分码偏差(DCB)的原理及其对高精度定位的关键影响。针对数据处理中因忽略DCB校正导致的常见错误,如单系统PPP高程偏差、多系统融合精度下降及电离层研究失真等,提供了实战解决方案与主流DCB产品获取、集成方法,帮助用户有效规避陷阱,提升数据处理精度。

k5l6m的博客 224

35.注册监听器的两种方法(View.OnClickListener)

1. 使用匿名类注册监听器public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

liuzhiqinag的博客 3547

《iOS之一起进大厂》系列-秒杀面试官的RunLoop底层原理面试题

Runloop是iOS面试中的必考题,不管大厂小厂都会问到。 这里包括了Runloop几乎所有的面试题,还有中肯完整的答案解释。

空杯子 1153

Abaqus子程序开发避坑指南:从UMESHMOTION到齿轮磨损分析实战

本文深入探讨Abaqus子程序开发中的关键技术与避坑指南,重点解析UMESHMOTION在齿轮磨损分析中的实战应用。从开发环境搭建、调试框架构建到性能优化和大规模计算,提供系统化的解决方案。通过真实案例展示如何避免内存泄漏、网格畸变等常见问题,并介绍数据驱动的磨损预测等前沿技术,帮助工程师提升仿真精度与效率。

weixin_30892037的博客 88

Android 白天黑夜模式切换适配及引起的Activity销毁重启解决

Android 10 暗黑模式适配

凌云志 1万+

登临科技Goldwasser加速卡Python SDK实战:从环境配置到YOLOv5模型性能压测

本文详细介绍了登临科技Goldwasser加速卡的Python SDK实战指南,从环境配置到YOLOv5模型性能压测的全过程。通过驱动安装、SDK环境搭建、模型转换与推理优化等步骤,帮助开发者高效利用AI加速卡提升深度学习模型性能。重点分享了批量推理压测技巧和常见问题解决方案,助力开发者充分发挥Goldwasser加速卡的算力优势。

weixin_29035147的博客 301

box-shadow实现外发光效果

box-shadow:-1px 0 20px #3B3B3B(左边), 1px 0 20px #3B3B3B(右边), 0 -1px 20px #3B3B3B(上边), 0 1px 20px #3B3B3B(下边)**用法:** box-shadow: h-shadow v-shadow blur spread color inset; h-shadow:水平阴影位置(允许负值) v-shad

孤独行者 5990

Token算力工厂建设方案:从GPU集群到计量计费的全链路设计

在AI应用从“租核”走向“买Token”的范式转换中,算力交付的核心指标已不再是vCPU或GPU实例,而是单位时间内的Token产出量与单Token成本。这一变化推动基础设施从资源租赁向计件生产演进,要求GPU集群、推理引擎、调度系统、计量计费等模块像工厂产线一样协同运转。本文从硬件异构混部、存储网络设计、推理引擎调优、Token网关与配额管理、稳定性治理等维度,系统拆解如何构建一座可量化、可计费、可扩展的Token算力工厂,并给出分三期落地的推进节奏,帮助架构师与技术管理者在AI基础设施建设中实现成本可控

weixin_29095587的博客 263

Bartender 2021破解版安装教程:手把手教你从下载到激活(附详细步骤图)

本文详细介绍了BarTender 2021专业版的安装与高效应用指南,从基础配置到高级条码设计,帮助用户快速掌握标签设计与打印技术。内容涵盖安装步骤、标签模板创建、数据连接与批量打印技巧,以及高级功能如安全策略与自动化集成,适合零售、物流、制造等行业用户提升工作效率。

p4q5r6s7t的博客 2643

日夜间模式切换

切换日夜间模式

Super Monster的博客 1336

37.华为路由器:loopback(本地回环)接口的作用

本地环回接口(或地址),亦称回送地址(loopback address)。 此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途: 1 作为一台路由器的管理地址 系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址 ,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。 但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢 ? 原因如下:由于

迷逝 3万+

android日夜间模式的切换:

大家好 我是 菠萝派 目前我知道的有三种 日夜间模式的切换方式: 1.设置setTheme 主题用来切换 2.设置asl(Android Support Library)中的 UiMode来支持日间/夜间模式的切换 3.通过资源id的映射 回调自定义ThemeChangeListener接口来处理日间页间模式的切换 今天就介绍一下第一种方式: 效果 step1: 在values...

Spider_007 1565

android 蓝牙通讯demo

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android实现日夜间模式切换

对于阅读类的App来说,没有夜间模式,

corerzhang的专栏 3187

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

简单实现日夜间模式切换

在values下的color中设置一个颜色 color name="bg_select">#fffcolor>//为日间模式时的颜色 新建一个values-night文件夹将values中的color复制到此文件夹下 color name="bg_select">#000color>//改变夜间模式时需要的颜色 //将夜间模式需要改变颜色的地方背景颜色设置为bg_select

duanzeshan的博客 1444

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android高级日夜切换,Android APP日夜间模式切换

说在前面日夜间模式在app上面的体验不必多说,特别是晚上,所以这玩意儿是个好东西,民间版本的夜间模式实现效果都很友好,但是都很复杂。官方在Android Support Library 23.2开始支持了夜间模式切换,所以大家伙儿不妨试试?上效果实践1.关于gradle依赖就不多说了,新建项目就会依赖compile'com.android.support:appcompat-v7:24.2.1'...

weixin_28993425的博客 1216

探索夜色:Android日夜间模式切换库——NightOwl

探索夜色:Android日夜间模式切换库——NightOwl 在移动应用开发中,提供一个可随环境变化的日夜间主题切换功能已经成为一种趋势。NightOwl是一个实验性的Android项目,专注于帮助开发者轻松实现这一特性。只需几行代码,你的应用就能拥有优雅的日夜切换效果。 项目介绍 NightOwl的核心在于其简洁的API设计和高效的运行机制。它为Android应用程序提供了动态切换日间和夜间模...

gitblog_00063的博客 875

Flutter日夜间模式切换组件推荐

Flutter日夜间模式切换组件推荐 本文将为您介绍一个优秀的开源项目——Flutter日夜间模式切换组件(Day Night Switch)。该项目采用Dart语言开发,适用于Flutter应用程序。 1. 项目基础介绍 项目名称:Day Night Switch 编程语言:Dart 该项目是一个Flutter组件,用于在应用程序中添加一个日夜间模式切换功能。用户可以通过一个简单的切换按钮在日间...

gitblog_00464的博客 516

Android APP日夜间模式切换

说在前面 日夜间模式在app上面的体验不必多说,特别是晚上,所以这玩意儿是个好东西,民间版本的夜间模式实现效果都很友好,但是都很复杂。官方在Android Support Library 23.2开始支持了夜间模式切换,所以大家伙儿不妨试试? 上代码 DayNightDemo 上效果 实践 1.关于gradle依赖就不多说了,新建项目就会依赖 compi

qq_23174861的博客 1600

推荐项目:Skin Sprite - 无缝切换日夜间模式的神器

推荐项目:Skin Sprite - 无缝切换日夜间模式的神器 在Android开发中,实现应用的日间与夜间模式切换,一直是许多开发者追求用户体验的重要功能。今天,我们要推荐的是一个轻量级且高效的解决方案——Skin Sprite,无需重新创建Activity,即可优雅地实现这一转变。 项目介绍 Skin Sprite,一款受appcompat-v7启发的库,专为解决Api 14以上版本的Andr...

gitblog_00152的博客 370

android日夜间模式切换动画

转载请说明出处 在一些应用中需要有日夜间模式,当切换模式之后,如果不给点过渡动画,那效果看起来比较差。 那用什么方式来做这个切换过渡动画呢? 第一种:选择用一个activity来做过渡 首先我们建一个activity import android.os.Bundle; import android.os.Handler; import android.view.View; imp

asd2603934小马哥 2900

android日夜间模式切换

一 日夜间模式方法 public class BaseActivity extends Activity { protected View mCoverView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

Zby___的博客 474
上一篇: ViewPager引导页实现跟随式小圆点
下一篇: 视频引导页
尘彦
博客等级 码龄11年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值