Android亮度调节的几种实现方法

最近在做一个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亮度更加简单有效。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android 如何设置开机后屏幕亮度默认值为自动调节

    在第一次开机后,设置>显示>自动亮度调节 默认是勾选上的. 修改 alps\frameworks\base\packages\SettingsProvider\res\values\defaults.xml 内的 <bool name="def_screen_brightness_automatic_mode">false</bool> 改为 <bool name="def_screen_brightness_automatic_mo

  • 使用android隐藏api实现亮度调节的方法

    Android 1.5之后将调节亮度的api隐藏了,不过android的源码中依然有方法可以实现,如下: 复制代码 代码如下: IPowerManager power = IPowerManager.Stub.asInterface(ServiceManager .getService("power")); if (power != null) { power.setBacklightBrightness(brightness); 上面的代码无法直接在官方的sdk中调用,会提示找不到I

  • Android编程调节屏幕亮度(背景灯)及保持背景灯常亮的方法

    本文实例讲述了Android编程调节屏幕亮度(背景灯)及保持背景灯常亮的方法.分享给大家供大家参考,具体如下: Android写的应用程序其实可以调节屏幕亮度的,查了一下资料发现WindowManager.LayoutParams这个类就包含了调节亮度的参数: WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = 0.1f; 其中参数screenBrightness就是设置屏幕亮度的0

  • Android调节屏幕亮度实现代码

    调节屏幕亮度时,先设置当前activity亮度,再并保存为系统亮度即可. 1 onCreate()里检查系统亮度并设置seekBar: private void screenBrightness_check() { //先关闭系统的亮度自动调节 try { if(android.provider.Settings.System.getInt(getContentResolver(),android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE)

  • android 屏幕亮度调节方法详解

    屏幕亮度自动调节:主要是从Sensor分析之中分离出来分析LIGHT 光线感应器,因此就分析一下自动调节屏幕亮度(手机随着光线的强度自我调节,也就是在亮的光线下屏幕自动调亮一些,暗的时候就自动调暗一些,省得光线对眼睛有刺激)..... (本人从历经挫折才大概了解流程),现在就开始讲一下流程,如果有不对地方希望牛人指出来... 先从Sttings入手吧,在diaplay中有屏幕亮度调节,有一个进度调,上面有一个checkbox(自动调节屏幕亮度的),那么我们当然去找settings下的文件开始看了

  • Android亮度调节的几种实现方法

    最近在做一个App的设置项,亮度调节.真正做时,发现Android亮度调节比预想要复杂一些.其实目前网上已有不少这方面的资料,但有些博文具有一定误导性.在此将这块内容按照自己理解整理一下. 整体上看,Android亮度调节分为三个层次,分别是:Android系统亮度调节.Android App亮度调节和Android当前屏幕(Window)亮度调节. 1.Android系统亮度调节 Android系统亮度调节全局性最高,常见于系统设置中的亮度设置项.Android中提供了获取和设置系统亮度值("

  • Android 线程thread的两种实现方法(必看)

    这篇文章中有三点需要提前说明一下, 一:在android中有两种实现线程thread的方法: 一种是,扩展java.lang.Thread类 另一种是,实现Runnable接口 二:Thread类代表线程类,它的两个最主要的方法是: run()--包含线程运行时所执行的代码 Start()--用于启动线程 三: Handler 机制,它是Runnable和Activity交互的桥梁,在run方法中发送Message,在Handler里,通过不同的Message执行不同的任务. 下面分别给出两种线

  • Android 截取手机屏幕两种实现方法

    Android 截取手机屏幕两种实现方法 最近在开发的过程中,遇到了一个需要截取屏幕保存为图片的需求,具体为截取webview的视图保存图片. 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: public void printScreen(View view) { String imgPath = "/sdcard/test.png"; view.setDrawingCacheEnabled(true); view.buildDrawingC

  • Android中定时执行任务的3种实现方法(推荐)

    在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式) 二.采用Handler的postDelayed(Runnable, long)方法(最简单的android实现) 三.采用Handler与timer及TimerTask结合的方法(比较多的任务时建议使用) 下面逐一介绍: 一.采用Handle与线程的sleep(long)方法 Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handle

  • Android中图片圆角三种实现方法

    目录 方法一 方法二 方法三 Android 开发中,经常需要对图片进行二次处理,比如添加圆角效果 或 显示圆形图片: 方法一 通过第三方框架 Glide 设置圆角效果: 写法1: RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30));//图片圆角为30 Glide.with(this).load(URL) /

  • Android自定义Dialog的2种常见方法

    目录 前言 方式一:继承DialogFragment,也是官方推荐的方式 事例 方式二:直接继承Dialog类或者AppCompatDialog类 更新 前言 大多数中,使用系统内置的dialog并不能满足UE的设计需要 方式一:继承DialogFragment,也是官方推荐的方式 通常我们只需要关注三个回调方法: onCreateDialog:创建一个dialog外壳 onCreateView:给dialog外壳填充自己想要的样式布局 onViewCreated:这里面给布局的view进行初始

  • Android定制RadioButton样式三种实现方法

    三种方法 1.使用XML文件进行定义 res/drawable/radio.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 未选中-> <item android:state_checked=&qu

  • Android延迟实现的几种解决方法及原理分析

    前言 在Android开发中我们可能会有延时执行某个操作的需求,例如我们启动应用的时候,一开始呈现的是一个引导页面,过了两三秒后,会自动跳转到主界面.这就是一个延时操作. 而写这篇文章的目的,是看到群里有人在实现延迟的时候,用如下的第四种方法,个人感觉有点不妥,为了防止更多的人有这种想法,所以自己抽空深入分析,就分析的结果,写下此文,希望对部分人有启示作用. 1.实现延迟的几种方法? 答: 1.java.util.Timer类的: public void schedule(TimerTask t

随机推荐