转载请注明出处:http://blog.csdn.net/lizhongstu/article/details/50779939
前言:大家好,由于公司项目需求,要加一个夜间模式的效果
夜间模式的实现方式有以下几种:
1.直接调整屏幕亮度
2.在Window上加一层半透明的View
3.换皮肤式解决方式(一)
每套皮肤使用自己的一套theme,使用attrs.xml+styles.xml+Activity.setTheme()来设置自己的主题以实现换皮肤,要求资源保存在本地。
4.换皮肤式解决方式(二)
图片等资源不在本地,可以由网上下载(可以作为.zip/.apk下载)后加载,但更换起来比较麻烦,需要大量代码配合,相对于.zip/.apk两种方式换肤我比较倾向于.zip方式,因为.apk方式我曾经弄过,很是复杂啊,必须保证.apk皮肤包中的皮肤图片跟主版本的皮肤图片和资源一 一对应起来,这是为了保证两个工程中的R文件中的id要一 一对应,如果皮肤包中的R文件中的id多一个或者少一个就会出现奔溃,反正这种方式没把我给折腾死。
我今天所讲的就是第二种方案实现夜间模式
第一种调整夜间模式的方式我也使用过,但是不是很好用
1. 如果用户把系统亮度调整到最低了,那你在夜间/白天模式几乎就没什么用了,因为亮度已经最低了。
用第二种方案实现夜间模式就能解决这个问题,亮度调整到最低了再window上加一层半透明的View,亮度就会变暗
网上也有讲解第二种实现夜间模式的方法,但是真正放到项目中去使用会出现很多问题,不知道你们遇到过没?网上都是用写几个简单的demo,demo毕竟不是一个真正上线的项目,真应用到项目中使用还是会有很多问题
在Window上加一层半透明的View
创建这种窗体需要向用户申请权限才可以的,因此首先在AndroidManifest.xml中加入<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW" />
首先在Eclipse中新建一个Android项目,项目名就叫做NightModeDemo
先创建一个BaseActivity的抽象类,所有的activity都继承这个抽象类,在里面加入如下代码:
public abstract class BaseActivity extends FragmentActivity {
private WindowManager mWindowManager = null;
private View mNightView = null;
private WindowManager.LayoutParams mNightViewParam;
private boolean mIsAddedView;
/**
* 夜间模式覆盖view 是否可用
* true:可用 false:不可用
*/
private boolean nightModeEnable=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int readMode=SpUtil.getinstance(this).getReaderModeCode();
//是否是夜间模式
if( readMode==1 && nightModeEnable){
changeToNight();
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
initView();
initData();
setListener();
}
@Override
public void setContentView(View view) {
super.setContentView(view);
initView();
initData();
setListener();
}
@Override
public void setContentView(View view, LayoutParams