Android夜间模式实现,通过在window上加一层半透明的View

本文介绍了一种在Android中实现夜间模式的方法,即在Window上添加一层半透明View。通过这种方式,即使系统亮度调至最低,也能实现屏幕变暗。文章详细讲述了实现过程,包括权限申请、BaseActivity的抽象类设置、布局文件修改以及如何处理Dialog的夜间模式。作者还指出了一些常见问题和错误做法,以避免黑屏闪动和夜间模式失效的情况。
摘要由CSDN通过智能技术生成

转载请注明出处: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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值