关于Android屏幕亮度的一个需求 [复制链接]

2019-12-9 10:15
一码到底 阅读:154 评论:0 赞:0
Tag:  
最近遇到一个需求:
在进入Act的时候,将屏幕亮度调整为最亮。然后当用户自己去调整屏幕亮度的话,当前设置失效,并跟随系统的亮度。

怎么修改屏幕亮度?

直接上代码
    /*
     * 调整当前Act的亮度,仅作用于当前Act范围0-1f
     * */

    public void setActivityBrightness(float paramFloat{
        Window localWindow = this.getWindow();
        WindowManager.LayoutParams params = localWindow.getAttributes();
        params.screenBrightness = paramFloat;
        localWindow.setAttributes(params);
    }
在启动Act的时候调用该方法即可。

出现的问题!

但是遇到了一个问题,通过这种方式设置的亮度,用户再去修改系统亮度,是没法改的。
然后又想到了另一种方法,去修改系统亮度。
但是啊,系统亮度是需要权限的,但是获取权限会影响用户体验,所以直接PASS。

如何解决?

然后发现了一个可以监听系统亮度发生变化的方法。
    //监听屏幕亮度变化
    getContentResolver().registerContentObserver(
        Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),
        true
        mBrightnessObserver);

     /*
     * 屏幕亮度变化监听的回调
     * */

    private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
        // 当前系统的屏幕亮度(当用户改变了系统亮度后,会回调到该方法)
        int currentValue = Settings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);
        }
    };

最终解决!

在监听里,当监听到用户第一次主动去修改屏幕亮度时,调用setActivityBrightness(2)让我们设置的屏幕亮度失效即可。
//在进入Act的时候调用
setActivityBrightness(1.0f)
//将当前Act的亮度设置为最亮(这个时候用户修改系统亮度是没法修改的)

//然后在刚才的监听里这样写
private ContentObserver mBrightnessObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            //isSettingSystemLight为标记,只有当用户第一次主动修改屏幕亮度后设置,再次碰触就直接抛出,已减少性能损耗。
            if (isSettingSystemLight) {
                //如果标记用户已主动修改过屏幕亮度,就抛出
                return;
            }
            //这里随便什么值,只要大于1.0f即可(这个时候当前Act的亮度会跟随用户的修改而变化)
            setActivityBrightness(2);
            isSettingSystemLight = true;
        }

    };
好了,讲到这里其实可以实现需求了,如果还有兴趣的可以向下看。

原理是什么?

具体什么原理,我也不知道,但是可以知道的是,在上边的监听模块,我本来的逻辑是,在拿到用户修改了系统亮度的回调后,我再调用
//其中currentValue是回调里获取的当前系统亮度,最大为255。然后出除一下,就可以得到当前的值了
setActivityBrightness(currentValue % 255)
一波操作后,测试了一下,发现,可以用哎。
然后又测试了一下,吧亮度调到了最低,发现,嗯???不对啊。
其实是我搞错了,我写成了
//这里应该是除以,但是我写成了取余,闹了个小乌龙,但是也解决了大问题。
setActivityBrightness(currentValue / 255)
然后我一想,这波操作?为什么屏幕亮度还会变化?
最终我灵机一动,在拿到回调后,吧屏幕值写死,成255看你还变不变。
可想而知,当前Act还是会跟随系统变化。
然后我感觉,这和我的方法好像没多大关系啊?

恍然大悟!

最终,我将回调屏蔽掉。在设置完亮度1f后,直接设置个999。
果不其然,如我所料。
    /*
     * 当setActivityBrightness()方法中的screenBrightness 值大于 1f 时,之前的设置将会失效。
     * */

        Window localWindow = this.getWindow();
        WindowManager.LayoutParams params = localWindow.getAttributes();
        params.screenBrightness = paramFloat;
        localWindow.setAttributes(params);
    }
也就是说:当值大于1f时,比如999,系统不知道该怎么设置了,就会判定设置无效吧当用户再次操作熊亮度时,当前Act也就会跟着系统的亮度而变化了。
没想到一个小乌龙还帮我解决了问题,佩服佩服!
原文作者:庄晓曼她老公
原文链接:https://blog.csdn.net/qq_38376757/article/details/103337908

我来说两句
您需要登录后才可以评论 登录 | 立即注册
facelist
所有评论(0)
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )