最近在做一个Demo的时候用到了调节屏幕亮度的功能,于是上网搜索了一下,并且写了一个小Demo测试了一下,发现代码还是比较简单的。Android中的亮度调节,主要有三个方向,一个是针对于系统的亮度调节,一个是针对于App的亮度调节,一个是针对当前屏幕的亮度调节。

  详细的内容大家可以参考文章尾部博文,写的特别详细清楚,这里我们只改变当前屏幕的亮度的实现:

下面是布局文件:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ggcomic.rabbit.lx.adjustlight.MainActivity"> <TextView
android:id="@+id/tv"
android:layout_below="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈哈哈"/>
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/cb"
android:layout_below="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跟随系统亮度"/>
</RelativeLayout>

布局很简单,这里使用seekBar来充当进度条,与使用ProgressBar等是一样的效果。

MainActivity中的代码:

 package ggcomic.rabbit.lx.adjustlight;

 import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.Toast; public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { private SeekBar seekBar;
private CheckBox cb; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
} /**
* 初始化监听
*/
private void initEvent() {
//设置seekBar进度被改变的时候的时间监听
seekBar.setOnSeekBarChangeListener(new MyOnSeekBarChangeListener());
//设置CheckBox的点选监听事件
cb.setOnCheckedChangeListener(this);
} /**
* 初始化控件的一些操作
*/
private void initView() {
seekBar = (SeekBar) findViewById(R.id.seek);
cb = (CheckBox) findViewById(R.id.cb);
//设置最大刻度
seekBar.setMax(255);
//设置初始的Progress
seekBar.setProgress(getSystemBrightness());
//出世设置checkBox为选中状态
cb.setChecked(true);
//设置初始的屏幕亮度与系统一致
changeAppBrightness(getSystemBrightness());
} /**
* 获得系统亮度
*
* @return
*/
private int getSystemBrightness() {
int systemBrightness = 0;
try {
systemBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return systemBrightness;
} /**
* 改变App当前Window亮度
*
* @param brightness
*/
public void changeAppBrightness(int brightness) {
Window window = this.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);
} @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(this, getSystemBrightness() + "", Toast.LENGTH_SHORT).show();
changeAppBrightness(getSystemBrightness());
} else {
int seekBarProgress = seekBar.getProgress();
changeAppBrightness(seekBarProgress);
}
} class MyOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//seekBar进度条被改变的时候取消checkBox的点选
cb.setChecked(false);
//改变亮度
changeAppBrightness(progress);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) { }
} }

代码看起来好像很多的样子,不过关键代码只有不多,获取系统亮度:

 private int getSystemBrightness() {
int systemBrightness = 0;
try {
systemBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return systemBrightness;
}

这个方法主要是用来获取系统当前的屏幕的亮度,这句话是重点:

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

其中的Settings是provider包下的。

需要注意的是,返回的亮度是介于0~255之间的int类型值(也是为什么我们将seekBar的MaxValue设置为255的原因)

然后是设置当前屏幕的亮度的代码:

 public void changeAppBrightness(int brightness) {
Window window = this.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);
}

这里我们先通过Window对象来获取当前窗口,然后通过

 WindowManager.LayoutParams lp = window.getAttributes();

老获取当前窗口的属性对象,screenBrightness为属性对象中一个字段,源码如下:

 /**
* This can be used to override the user's preferred brightness of
* the screen. A value of less than 0, the default, means to use the
* preferred screen brightness. 0 to 1 adjusts the brightness from
* dark to full bright.
*/
public float screenBrightness = BRIGHTNESS_OVERRIDE_NONE;

可见,screenBrightness是一个0.0~1.0之间的float类型的参数,亮度由0.0~1.0递增。如果该值小于0,则默认采取最优的屏幕亮度来适配(经过测试就是系统亮度),这里我们使用了一个三目运算符,判断如果亮度值小于0的话将其置为1.

代码中关于brightness==-1的判断是将-1作为一个标志位,标志当app设置中包含"跟随系统亮度"或者"恢复系统亮度"的时候,我们传递一个-1参数,这时将screenBrightness参数还原成默认数值(跟随系统)即可。

思路

拖动seekBar的进度条来改变屏幕亮度的时候,主要的思路就是:

设置seekBar的OnSeekBarChangeListener监听,当seekBar的进度改变的时候,我们得到当前的进度,然后将其转换成0.0~1.0之间的值,为当前窗体的属性screenBrightness属性设置值,完成屏幕亮度的改变。

最后附上一篇特别相信的文章,大家可以去看看~

Android 亮度调节

Android中获取并设置屏幕亮度的更多相关文章

  1. Android中使用ViewPager实现屏幕页面切换和页面切换效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...

  2. Android中的颜色设置

    1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如 public static final class color { public static final int lightb ...

  3. 【转】Android中的颜色设置

    原文网址:http://www.cnblogs.com/bluestorm/p/3644669.html 1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如: 1 2 3 publ ...

  4. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  5. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  6. Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用

    关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的 应用程序,大家如果真正的有所兴趣,建议大家看看源码, ...

  7. android中获取其他应用的SharedPreferences

    在android中获取其他应用的SharedPreferences,需要其他应用设置的Mode为MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE两种模式.要获取其他应用 ...

  8. URL转Drawable之 Android中获取网络图片的三种方法

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...

  9. android 中获取视频文件的缩略图(非原创)

    在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...

随机推荐

  1. 《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer

    一.定时器Timer的使用 1.1 方法schedule(TimerTask task, Date time) 是否过期 执行说明 开始执行时间 time>当前时间(未过期) 在time到达时执 ...

  2. HDU 3388 Coprime(容斥原理+二分)

    Coprime Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  3. MAPISession(EventID9646-MS-ExchangeIS)

    查看邮箱登录信息: Get-LogonStatistics jsmith | Sort-Object clientipaddress | Format-Table Get-LogonStatistic ...

  4. 三、直播整体流程 五、搭建Nginx+Rtmp直播流服务

    HTML5实现视频直播功能思路详解_html5教程技巧_脚本之家 https://m.jb51.net/html5/587215.html 三.直播整体流程 直播整体流程大致可分为: 视频采集端:可以 ...

  5. jmeter断言之BeanShell断言

    1.添加BeanShell断言,在Script下面写断言脚本,常用的BeanShell脚本如下: if(!SampleResult.getResponseCode().equals("200 ...

  6. java maven项目打包

    使用IDEA打包,首先调出来maven projects窗口: 菜单栏Help->Find Action(Ctrl+Shift+A),输入Maven projects https://blog. ...

  7. Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法

    Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  8. iMessenger 2.0.14.0801简述

    有些梦,看似遥不可及.但并非不能实现,仅仅要你足够的强!!.人力有时而穷,所以我们可能还须要一些热心人的帮助.这个人可能就是你. 四年来,我们一直在努力,从未放弃. 在我们做好一件事之前.我们永远不知 ...

  9. Python-selenium 下拉框定位

    1.通过select 进行定位下拉框 首先selenium 很人性化的给提供了一个Select的模块,供处理下来菜单,首先我们需要导入Select,通过from selenium.webdriver. ...

  10. 添加github ssh 公钥

    1.在控制台输入命令: ssh-keygen -t rsa -C "github上的邮箱地址" 2.将公匙复制后添加到github网站:    id_rsa.pub文件 3.测试是 ...