前段时间写了一篇关于android夜间模式的博客地址是:http://1029457926.iteye.com/blog/2202106,原理是在Activity的启动之前判断是否是黑夜模式,然后调用setTheme方法来设置相应的布局。下面讲讲如何用代码来实现:
原理都差不多都是根据当前app是否是模式(白天和黑夜),然后去改变控件的属性。
步骤如下:
1 为View准备白天和黑夜的2种不同的属性布局
一个线性布局可能白天的背景和黑夜的背景都是不同,还有一个TextView的字体颜色白天和黑夜也可能不同。所以我们要先准备2套View的白天黑夜的不同属性配置。为了便于管理可以把这些属性放在2个文件夹下:
2 接下来就在代码中实现各种属性的白天黑夜的切换了
项目中白天黑夜切换的属性比较多,如textColor,background,图片的src,甚至是字体的大小,具体当然要看项目的需求。所以最好把这些方法封装放在一个工具类中,每当Activity
setContentView之后,我们可以调用这些方法,就可以实现切换了。
2.1 动态改变View的background属性
原理:先从sharePreference中取出当前的模式,判断当前是白天模式还是黑夜模式(默认是白天模式),如果是白天模式就给View设置白天的背景颜色,反之就设置View的黑夜的背景。
public static void setDrawableBackground(final View view, int idLight, int idNight) {
try {
Drawable drawable;
if (SnsUtil.isThemeDefault()) {
drawable = Global.context.getResources().getDrawable(idLight);
} else {
drawable = Global.context.getResources().getDrawable(idNight);
}
view.setBackgroundDrawable(drawable);
} catch (Exception ex) {
}
}
最好加上日志处理,以便可以方便定位到异常信息,在代码中可以这样调用:
ThemeUtility.setDrawableBackground(iconPostUp,R.drawable.sel_top_feed_unposted_light,
R.drawable.sel_top_feed_unposted_night);
2.2 动态改变TextView的TextColor属性
public static void setTextColor(final TextView tv, int idLight, int idNight) {
ColorStateList cl;
try {
XmlResourceParser xpp;
if (SnsUtil.isThemeDefault()) {
xpp = Global.context.getResources().getXml(idLight);
} else {
xpp = Global.context.getResources().getXml(idNight);
}
cl = ColorStateList.createFromXml(Global.context.getResources(), xpp);
tv.setTextColor(cl);
} catch (Exception ex) {
}
}
方法调用:
ThemeUtility.setTextColor(tvPostUpCount, R.color.sel_gray_3_light, R.color.sel_gray_3_night);
如果一个app要做页面模式的话,其代价是很高的,要做2套布局,主要是图片,UI要为白天模式要切一张,黑夜模式也要切一张,app的体积自然就大了不少。当然这个代价是值得的,晚上的时候你突然打开手机看看新闻,是不是会觉得很刺眼呢?所以一般的新闻客户端都会有夜间模式。
2.3 白天和黑夜的颜色对照表
下面给大家分享一下:
3 夜间模式实现的优缺点比较
实现夜间模式的方式有:
(1) 用布局文件来实现
优点:这种方法实现非常简单,只需配置2套布局即可,写的代码非常少。
缺点:内存消耗大,用户体验不好。
项目中我们就是这么实现的,但是只能在setContentView之前调用setTheme方法来改变当前模式,如果当用户由白天切换到黑夜之后,按返回键你会发现,原来的页面还是白天模式,只有onResume方法中通过重新启动Activity才切换到黑夜模式(重新调用了一次setTheme方法),但是有时候会出现闪屏的现象。
(2)全部由代码来实现
优点:bug少,用户体验好
这种方法我相信开始的时候大部分程序员都不会采用,要为很多View设置变化样
式,这无形中就增加了不少的代码。当在模式切换后,按返回键,为了在显示出来的Activity中看到模式切换后的样式,第一种方法要重启Activity,但是第二种方法,完全不用考虑这些。这样既避免了闪屏,又避免了Activity的再次启动,提升了性能消耗。同时不会闪屏,用户体验会更好些。我知道的知名的新闻客户端就是通过第二种方法来实现夜间模式的, 而不是 第一种这种取巧的方法。
缺点:代码量大。
所以以后要app做黑夜模式的同学,吸取BZ的教训,采用第二种实现方法,避免以后少走点弯路。如果谁有更好的实现android夜间模式的方法,都可以来和BZ交流!
相关推荐
包含三个Android工程示例代码: 1. 使用降低屏幕亮度的方式实现夜间模式 2. 使用替换theme的方式实现夜间模式 3. webView实现白天/夜间模式阅读
Android夜间模式实现,通过在window上加一层半透明的View,解决网上坑点,亲自在项目中尝试
Android原生方式实现程序夜间模式,相应文档地址: http://blog.csdn.net/qq_23383563/article/details/52493320
Android夜间模式
Android 夜间模式 改变字体颜色 模式记录在本地 下次进入 显示上次设置的模式 代码简单易懂 赚点分不容易 支持下吧!
ThemeDemo日夜间模式切换,页面切换的时候附带动画特效, 关于多主题实现的,大牛这里的做法是继承AppCompatActivity,置换了AppCompatDelegate中AppCompatViewInflater中的createView 方法.实现了对 xml 控件的控制. ...
android夜间模式切换,颜色渐变效果实现 博客地址:http://blog.csdn.net/tyzlmjj/article/details/49255019
Android日夜间模式切换
app不乏需要添加夜间模式和日间模式的皮肤,本demo采用Android官方在Support Library 23.2.0中已经加入了夜间主题
Android夜间模式实现,通过在window上加一层半透明的View.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
实现了日夜模式的切换.(不重启 Acitivity ) 解决了因为快速点击 View 导致的多次响应点击事件. 内部实现了 Android 5.0 的CircularReveal效果. 优点: 布局中直接使用 Android 默认的控件就可以.在解析以后会根据...
另一种不重启Activity 切换Android夜间模式的库
NULL 博文链接:https://1029457926.iteye.com/blog/2202106
通过自定义主题进行夜间模式的核心demo 重启设置及其设置页面以前的activity
通过css注入的方式实现android webview的夜间模式。
It is an experimental project for switching day/night mode on Android. View the demo video on Youtube. This will help you understand the project. Dependencies add nightowllib library to your project ...
Android WebView添加夜间模式
夜间模式实现 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛,实现方式也就是所谓的换肤(主题切换)。对于夜间模式的实现网上流传了很多种方式。也反编译了几个新闻类...
Android改Theme实现夜间模式, 说明地址:http://blog.csdn.net/u012572538/article/details/38726549
这是个方便切换夜间模式的库,利用官方夜间模式,同时不用重启Activity