Android中获取并设置屏幕亮度
最近在做一个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中获取并设置屏幕亮度的更多相关文章
- Android中使用ViewPager实现屏幕页面切换和页面切换效果
之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...
- Android中的颜色设置
1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如 public static final class color { public static final int lightb ...
- 【转】Android中的颜色设置
原文网址:http://www.cnblogs.com/bluestorm/p/3644669.html 1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如: 1 2 3 publ ...
- android中获取root权限的方法以及原理(转)
一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...
- Android中获取系统上安装的APP信息
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...
- Android中获取正在运行的服务-------ActivityManager.RunningServiceInfo的使用
关于PackageManager和ActivityManager的使用 ,自己也写了一些DEMO 了,基本上写的线路参考了Settings模块下的 应用程序,大家如果真正的有所兴趣,建议大家看看源码, ...
- android中获取其他应用的SharedPreferences
在android中获取其他应用的SharedPreferences,需要其他应用设置的Mode为MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE两种模式.要获取其他应用 ...
- URL转Drawable之 Android中获取网络图片的三种方法
转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...
- android 中获取视频文件的缩略图(非原创)
在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...
随机推荐
- MVC 多种 数据验证 post
技术:c# .net 采用mvc框架,实现model的数据验证. 刚开始觉得数据验证很方便,可以判断非空.数据正确性,但是后来发现很多需要数据库的判定还是需要post请求做,但是就想mvc的数据验证 ...
- 【BZOJ4665】小w的喜糖 容斥+组合数
[BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...
- python之django直接执行sql语句
python之django直接执行sql语句 sql = 'select * from stu' info = 模型类.objects.raw(sql)
- 【Python之路】第十二篇--JavaScript
JavaScript 历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Net ...
- Vulnerabilities by Type
w http://hackergossips.com/cross-site-scriptingxss-and-preventing/
- 转!!Java设置session超时(失效)的时间
Java设置session超时(失效)的时间 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...
- 《深入理解Linux内核》阅读笔记 --- Chapter 3 Processes
Process Switching 1.The set of data that must be loaded into the registers before the process resume ...
- 开发微信公众平台--新建新浪云sae部署server
创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为server资源.而且申请PHP环境+MySQL数据库作为程序执行环境. 申请地址:百度搜sae ,使用新浪微博账号能够直接登录SAE,登 ...
- 简明python教程七----面向对象的编程(下)
继承:类之间的类型和子类型关系 代码重用:SchoolMember类被称为 基本类或超类,而Teacher和Student类被称为导出类或者子类 #!/usr/bin/python #Filename ...
- JS连等赋值的坑
cnblogs标题: JS连等赋值的坑 关于JS连等赋值有个经典的笔试题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); ...