最近在做一个App的设置项,亮度调节。真正做时,发现Android亮度调节比预想要复杂一些。其实目前网上已有不少这方面的资料,但有些博文具有一定误导性。在此将这块内容按照自己理解整理一下。

整体上看,Android亮度调节分为三个层次,分别是:Android系统亮度调节、Android App亮度调节和Android当前屏幕(Window)亮度调节。

1、Android系统亮度调节

Android系统亮度调节全局性最高,常见于系统设置中的亮度设置项。Android中提供了获取和设置系统亮度值(“手动模式下的亮度值”)的接口,具体如下:

// 获取系统亮度

Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);

// 设置系统亮度

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);

其中,需要注意的是,返回的亮度值是处于0-255之间的整型数值。

Android 2.1以后的系统中,系统亮度调节中新增了“自动亮度”选项。“自动亮度”是依据外界光源来自动的改变系统亮度,目前大部分手机中对“自动亮度”还可以进行小幅度的调节其值。与自动亮度相对应的是“手动亮度”,当处于“手动亮度”下,设置拖动亮度进度条会大幅度的改变Android系统亮度。“手动亮度”和“自动亮度”分别称之为Android系统的“亮度模式”。

与之相对应的,Android系统中也提供了获取和设置“亮度模式”的接口。

// 获取系统亮度模式

Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);

// 设置系统亮度模式

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, systemMode);

可是遗憾的是,Android中并未提供处于“自动亮度”模式下的亮度值接口。上面所说的获取系统亮度值接口实际上都是指“手动亮度”模式下的亮度值。

一般而言,通过手动亮度值以及设置系统亮度模式接口,可以满足常规的大部分针对Android系统亮度设置编码需求,以完成系统亮度调节。

2、Android App亮度调节

与系统亮度不同的是,Android中并未直接提供针对于App层面的亮度调节方式。因此,对于需要进行App的亮度调节,可以通过系统亮度调节或当前屏幕的亮度调节方式间接来实现。

3、Android当前屏幕(Window)亮度调节

Android针对当前屏幕(Window)提供了设置亮度的接口,常见写法如下:

Window window = activity.getWindow();

WindowManager.LayoutParams lp = window.getAttributes();

lp.screenBrightness = brightness;

window.setAttributes(lp);

其中,需要注意的是此处的brightness是一个0.0-1.0之间的一个float类型数值。

默认情况下,当我们直接修改了系统亮度值后,当前Window中是可以即时反应出来亮度效果的,这是因为默认情况下,WindowManager.LayoutParams的screenBrightness的默认值为WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE。

即表示Window没有自己的亮度参数,将依随系统亮度效果的变化而变化。这也就是我们最常见的:当调整系统亮度后,所有Window都即时反应出系统亮度设置效果。

当时,实际项目中我们还会遇到此类需求:系统设置亮度时只针对当前Window或App内生效,而不影响到系统本身的亮度设置。

假设当前Window内有一个SeekBar,UI与系统亮度调节UI基本类似,用户可以滑动此SeekBar,使得当前Window亮度即时发生变化,且不影响到系统亮度效果。如何实现呢?

此时我们需要启用WindowManager.LayoutParams的screenBrightness参数,使之具有自动的特定亮度值,设置此值后在当前Window范围内,其将覆盖掉系统亮度设置。

因此,有必要将用户选择的亮度值转换为相应的Window亮度值(为与系统亮度值相一致,假设SeekBar的最大值为255)。

// 根据亮度值修改当前window亮度

public void changeAppBrightness(Context context, int brightness) {

Window window = ((Activity) context).getWindow();

WindowManager.LayoutParams lp = window.getAttributes();

if (brightness == -1) {

lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;

} else {

lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;

}

window.setAttributes(lp);

}

其中,brightness形参为用户选择的亮度值。

那么,上述代码中为什么有一个”brightness == -1″的判断呢?在此主要是考虑到App设置项中可能出现的“跟随系统亮度”或“恢复系统默认亮度”此类设置,当用户进行此类操作时,直接将screenBrightness参数还原成默认参数值即可。因为由前文描述“自动亮度”模式下系统亮度值是不能直接得到的,那么当系统处于“自动亮度”模式下,此时brightness参数值将无法准确确定,因此,将screenBrightness参数还原成默认参数值成为一个行之有效的方法。

4、Android App亮度调节可行方案分析

目前网上有不少博文中提到App亮度调节时,提出的方案是在App设置项中,首先记录下设置之前的系统亮度值和亮度模式,用户在App设置项进行亮度调节时,直接修改系统亮度值,当用户退出此App,或App至于后台(如按下Home按键等),再将系统亮度还原。初看起来貌似一个可行的方案。但是主要存在如下几个问题:

1、如何获取到设置之前的系统亮度值和亮度模式(因为之后在此App外部要恢复系统亮度值到此初始值)?当用户每次进入到设置页时获取?严格意义上来说,是没法准确记录的。因为Android的用户操作不可预知性,如进入到设置页,拖动SeekBar设置了一个亮度值,此时直接修改了系统的亮度值,如果此时用户在未将应用至于后台或未将应用退出的情况下直接在App外部修改了系统亮度设置,如小米中可以通过下拉标题栏,直接就可以设置系统亮度。因此,App亮度设置之前的系统亮度初始值获取存在困难。

2、如何判断用户来到了App外部?因为此时需要恢复系统亮度设置到初始系统亮度。如用户可以按下Home按键,长按Home按键直接切换App,直接Back按键等一步步退出此App,下拉标题栏直接点击其他App通知信息进入到其他App,手机自动锁屏后解锁时用户直接进入其他应用等等,此类操作场景也具有不可预知性,因此,判断用户来到了App外部以恢复系统亮度到初始值的时机上也存在一定困难。

由此,App亮度调节方案推荐通过设置当前屏幕(Window)方式进行。

大致思路如下:用户在设置项中进行亮度调节时,调用changeAppBrightness()方法,将改变当前屏幕(Window)的亮度,此时对系统亮度无任何影响,接下来存在的问题终于要就集中于当用户来到本App其他Activity中,如果使得刚刚设置的亮度值得以即时反应出来。

当用户进行亮度调节后,将当前亮度设置值保存起来(如保存到SharedPreferences中),在基类Activity中的onResume方法中,可以取出SharedPreferences中的用户所设置的App亮度值,然后changeAppBrightness()方法以实现每个当前屏幕的亮度调节。

总体说来,通过设置当前屏幕(Window)的方式来设置App亮度更加简单有效。

https://www.cnblogs.com/lwbqqyumidi/category/523548.html

java手机太亮,Android 亮度调节相关推荐

  1. android设置自动亮度,Android亮度调节的几种实现方法

    最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其实目前网上已有不少这方面的资料,但有些博文具有一定误导性.在此将这块内容按照自己理解整理一下. 整体上看, ...

  2. Android 亮度调节

    专注Android领域开发.仰望星空,同时需要脚踏实地. --好记性不如烂博客 Android 亮度调节 最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其 ...

  3. Android 亮度调节的方法

    整体上看,Android亮度调节分为三个层次,分别是:Android系统亮度调节.Android App亮度调节和Android当前屏幕(Window)亮度调节. 1.Android系统亮度调节 An ...

  4. java手机电池充电代码,android电池管理系统从上层的java到底层驱动的调用(转载)...

    1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状 ...

  5. android手机 文件丢失,Android手机意外删除了文件恢复

    操作方法: 如果手机已启用云备份功能或使用第三方云备份软件,则可以登录手机上的云备份帐户,最后将数据同步到手机上. 可恢复的内容包括图片和文件,信息,地址簿. Android手机使用技巧: 1.由于A ...

  6. Ubuntu屏幕太亮,调节Brightness亮度条没有反应,解决办法之一

    一.情况说明 1.电脑Dell,系统ubuntu18.04 2.装了几个Brightness Controller软件,调节亮度条屏幕亮度没有任何反应   3.我电脑系统设置里没有屏幕亮度调节,只有k ...

  7. android 7.0 暗 主题,手机亮度调节超暗模式APP 7.0.3 安卓免ROOT

    这款手机亮度智能调节工具可以让大家在日常使用手机的过程中能够更好的保护视力.多种护眼模式功能切换,根据不同的使用场合与用途来为你提供不同的亮度和色温.夜间模式.看书模式等等,保护你的视力! 手机亮度调 ...

  8. 手机屏幕亮度调节软件java_Android视频播放器屏幕左侧边随手指上下滑动亮度调节变暗变亮原理实现...

    Android视频播放器屏幕左侧边随手指上下滑动亮度调节变暗变亮原理实现 Java代码: package zhangphil.app; import android.app.Activity; imp ...

  9. 计算机屏幕暗度怎么调,电脑屏幕亮度太亮怎么调暗一点

    原标题:"Win7系统电脑屏幕亮度太亮的解决方法"关于电脑问题教程分享. - 来源:网络投稿. Win7系统电脑屏幕太亮怎么办?电脑显示器屏幕太亮该如何调低?下面就给大家介绍Win ...

最新文章

  1. 本质矩阵与基本矩阵(对极几何)
  2. property Alternative forms propretie
  3. VDI序曲十五 配置 RemoteFX 以获得最佳体验
  4. plsql(轻量版)_基本语法
  5. 【matlab函数】convn多维卷积
  6. dbgrideh指定某单元格变色_一招搞定按指定名称批量新建文件夹
  7. 信息学奥赛C++语言: 回文数个数
  8. springboot读取src下文件_java(包括springboot)读取resources下文件方式
  9. Objective-C中的@Property具体解释
  10. vulnhub-DC-9靶机渗透记录(适合新手详细版)
  11. 关于中英文等宽字体的设置
  12. 自然辩证法小总结思维导图
  13. 仙剑5手游服务器维护,仙剑奇侠传手游维护及内容更新公告
  14. 全球网络波动实时监控系统--网动仪
  15. 2021 字节前端面试题汇总
  16. HTML,img标签src路径错误及src路径图片无法显示问题,相对路径和绝对路径,超级详细的新手教程。
  17. 【持续更新】树莓派启动与故障系列集锦
  18. Excel一键将-替换为--的批量操作
  19. jQuery 搜索条件联合查询 (数组条件查询)
  20. 五分钟理解什么是接口

热门文章

  1. 随笔小算法:从一个数据根据CRC校验出特定包
  2. IoT:MQTT协议详解
  3. JAVA:JDK目录结构和文件作用介绍
  4. 计算机能考四川司法学院吗,四川司法警官职业学院计算机文化基础课程在线考试系统...
  5. canvas 文字颜色_一篇图文学会HTML5的canvas标签,直线曲线文字渐变,统统可以有...
  6. python如何用c语言表示_python如何调用c语言
  7. div盒子水平垂直居中的方法
  8. 修改jar 注入_Apache Tika命令注入漏洞挖掘
  9. shell基础(下) 特殊符号
  10. django 发送php,django 使用 request 获取浏览器发送的参数