Android夜间模式的几种实现
一、直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂。例如:
/**
* 相应交互,修改控件颜色
* @param view
*/public void onMethod1Click(View view) {
if (view.getId() == R.id.btn_method1) {
int theme = NightModeUtils.getSwitchDayNightMode(this);
NightModeUtils.setBackGroundColor(this, mRootView, theme);
NightModeUtils.setTextColor(this, findViewById(R.id.text), theme);
NightModeUtils.setDayNightMode(this, theme);
}
}
NightModeUitls修改颜色方法
/**
* 修改背景色
* @param context
* @param view
* @param theme
*/public static void setBackGroundColor(Context context, View view, int theme) {
int color = context.getResources().getColor(
theme == THEME_SUN ? R.color.light_color : R.color.night_color);
view.setBackgroundColor(color);
} /**
* 修改文字色
* @param context
* @param view
* @param theme
*/public static void setTextColor(Context context, View view, int theme) {
int color = context.getResources().getColor(
theme == THEME_SUN ? R.color.night_color : R.color.light_color);
TextView textView = (TextView)view;
textView.setTextColor(color);
}
二、通过修改Theme,更新应用主题。这种方法问题在于,需要重启Activity才能完成界面渲染。
在Activity中调用setContentView之前进行Theme设置:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NightModeUtils.onActivityCreateSetTheme(this);
setContentView(R.layout.activity_main);
}
NightModeUitls设置Theme方法:
/** Set the theme of the activity, according to the configuration. */public static void onActivityCreateSetTheme(Activity activity) {
int theme = getDayNightMode(activity);
switch (theme) {
case THEME_SUN:
activity.setTheme(R.style.AppSunTheme);
break;
case THEME_NIGHT:
activity.setTheme(R.style.AppNightTheme);
break;
default:
break;
}
}
三、通过怎加一层遮光罩来实现。效果不是很理想。
通过WindowManager,将一个透明背景的TextView加到Activity主界面中。代码如下:
private void night() {
if (mNightView == null) {
mNightView = new TextView(this);
mNightView.setBackgroundColor(0xaa000000);
}
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
lp.gravity = Gravity.BOTTOM;
lp.y = 10;
try {
mWindowManager.addView(mNightView, lp);
} catch (Exception ex) {
}
}
private void day() {
try {
mWindowManager.removeView(mNightView);
} catch (Exception ex) {
}
}
四、最后来看一下Dialog需要怎么实现夜间模式。
AlertDialog.Builder 有一个带style id参数的构造函数,我们就通过这个构造函数来实现Dialog主题的修改,从而达到夜间模式。
public static AlertDialog.Builder createBuilder(Context context) {
if (NightModeUtils.getDayNightMode(context) == NightModeUtils.THEME_SUN) {
return new AlertDialog.Builder(context);
} else {
return new AlertDialog.Builder(context, R.style.NightDialog);
}
}
我们通过如上方法来获取Builder,实现主题切换。其中R.style.NightDialog我采用如下方式:
<style name="NightDialog" parent="android:Theme.Holo.Dialog"><item name="android:windowBackground">@android:color/transparent</item></style>
在android honeycomb之前的版本Theme.Dialog.Alert与AlertDialog这两个style是public的,可以通过修改主题时,重新定义这两个style实现dialog主题的修改,但之后的版本已经将他们开放关闭了。所以,我通过上面的办法实现了dialog的主题修改。
Android夜间模式的几种实现的更多相关文章
- Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)
1. 夜间模式 所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛.特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验. 2. 我根据网上的资料 以及自 ...
- Android 利用an框架快速实现夜间模式的两种套路
作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22520818来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 网上看到过大多实现夜间模 ...
- android夜间模式实现
一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...
- Android 夜间模式changeskin小结
@author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...
- Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)
1. 问题引入: 前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天.夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办? 分 ...
- Android 夜间模式的实现
package com.loaderman.daynightdemo; import android.os.Bundle; import android.support.v7.app.AppCompa ...
- Android启动模式(三种)
1,标准启动模式 通过任务栈,每点一次button,将每一个实例都压入,然后点返回键时候,就弹出之前压入的实例. 每一次的地址都是不同的 测试代码:通过创建一个button和textView来显示本身 ...
- Android白天/夜间模式Day/Night Mode标准原生SDK实现
Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...
- Android 之夜间模式(多主题)的实现
引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...
随机推荐
- 更好用的cmd窗口
cmder是windows下的命令行工具,用来替代windows自带的cmd. 下载地址 下载后自建文件夹并解压,将Cmder.exe所在文件夹路径加入path, windows + r 键入cmde ...
- java 判断字符串什么编码类型
public static String getEncoding(String str) { String encode = "GB2312"; try { if (str.equ ...
- HDU 1029 某个数出现的次数大于等于(N+1)/2的是哪个 map水题
题意:输入n个数 n为奇数 问某个数出现的次数大于等于(N+1)/2的是 哪个 输出来Sample Input51 3 2 3 3111 1 1 1 1 5 5 5 5 5 571 1 1 1 1 1 ...
- 写给Android开发者的混淆使用手册
转自:http://huihui.name/2016/10/23/%E5%86%99%E7%BB%99Android%E5%BC%80%E5%8F%91%E8%80%85%E7%9A%84%E6%B7 ...
- AOJ 0005 GCD and LCM
题意:求两数最大公约数和最小公倍数. 类型:辗转相除法 算法:gcd(a,b)=gcd(b,a%b),lcm(a,b)=a*b/gcd(a,b). #include <cstdio> #i ...
- SQL中IN和EXISTS用法的区别
结论 1. in()适合B表比A表数据小的情况 2. exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用. select * fro ...
- python全栈开发day49-jquery的位置信息、事件流、事件对象,事件委托,事件绑定和解绑
一.昨日内容回顾 1. jQuery的属性操作 1) html属性操作:attr 2) DOM属性操作:prop 3) 类样式操作:addClass.removeClass.toggleClas ...
- 取消a标签或者onclick在移动端点击时的背景颜色
一.取消a标签在移动端点击时的蓝色 -webkit-tap-highlight-color: rgba(, , , ); -webkit-user-select: none; -moz-user-fo ...
- python面试笔试题,你都会了吗?快来复习
1.一行代码实现1--100之和 利用sum()函数求和 >>> sum(range(0,101)) 5050 2.如何在一个函数内部修改全局变量 利用global 修改全局变量 a ...
- 【Java】 剑指offer(15) 数值的整数次方
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 实现函数double Power(double base, int ...