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 ...
随机推荐
- 《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer
一.定时器Timer的使用 1.1 方法schedule(TimerTask task, Date time) 是否过期 执行说明 开始执行时间 time>当前时间(未过期) 在time到达时执 ...
- HDU 3388 Coprime(容斥原理+二分)
Coprime Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- MAPISession(EventID9646-MS-ExchangeIS)
查看邮箱登录信息: Get-LogonStatistics jsmith | Sort-Object clientipaddress | Format-Table Get-LogonStatistic ...
- 三、直播整体流程 五、搭建Nginx+Rtmp直播流服务
HTML5实现视频直播功能思路详解_html5教程技巧_脚本之家 https://m.jb51.net/html5/587215.html 三.直播整体流程 直播整体流程大致可分为: 视频采集端:可以 ...
- jmeter断言之BeanShell断言
1.添加BeanShell断言,在Script下面写断言脚本,常用的BeanShell脚本如下: if(!SampleResult.getResponseCode().equals("200 ...
- java maven项目打包
使用IDEA打包,首先调出来maven projects窗口: 菜单栏Help->Find Action(Ctrl+Shift+A),输入Maven projects https://blog. ...
- Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- iMessenger 2.0.14.0801简述
有些梦,看似遥不可及.但并非不能实现,仅仅要你足够的强!!.人力有时而穷,所以我们可能还须要一些热心人的帮助.这个人可能就是你. 四年来,我们一直在努力,从未放弃. 在我们做好一件事之前.我们永远不知 ...
- Python-selenium 下拉框定位
1.通过select 进行定位下拉框 首先selenium 很人性化的给提供了一个Select的模块,供处理下来菜单,首先我们需要导入Select,通过from selenium.webdriver. ...
- 添加github ssh 公钥
1.在控制台输入命令: ssh-keygen -t rsa -C "github上的邮箱地址" 2.将公匙复制后添加到github网站: id_rsa.pub文件 3.测试是 ...