1、需求分析
在使用微信或者支付宝的付款码支付时,如果你点击放大付款码,就会跳转到一个新的页面去显示大尺寸的付款码,而且你会发现屏幕变亮了,这样会便于扫码机识别你的付款码。当你付款成功退出付款码放大的界面后,屏幕就会恢复到原先的亮度。我很早就注意到了这点,所以当我自己的项目需要做二维码点击放大功能时,我也在放大的同时把屏幕的界面调亮一点。尽管我当时比较轻松地实现了这个功能,但是当我编写屏幕亮度工具类时,发现里面其实内有乾坤。现在就让我们来系统学习一下。
首先我们要明确“屏幕亮度”是什么。它其实包含了两种情况:
- 当前窗口的亮度。如果只改变当前窗口的亮度的话,当你退出该窗口(比如销毁了当前的Activity或者干脆退出了应用),那么屏幕就会恢复原先的亮度。也就是说,此处的改变只对当前的窗口有效。微信或支付宝在点击放大付款码后,改变的就是这个。
- 改变系统屏幕亮度。在下拉的手机设置面板中,有一个改变屏幕亮度的进度条(下图中的红框),这里改变的就是系统的屏幕亮度,适用于所有的窗口。
2、准备工作
创建一个BrightnessActivity
,然后在里面放置两个进度条,一个改变系统亮度,一个改变窗口亮度。为了便于以后使用,我们会把用到的方法都封装到一个工具类中。所以再创建一个名称为BrightnessUtil
的Kotlin文件,但是不要创建类,因为我们会使用扩展成员的方式来编写工具类。
温馨提示:最近大半年都在使用Kotlin,这实在是一门很棒的语言,推荐大家学习。以后的博客我一般都会使用Kotlin了。
3、改变当前窗口亮度
首先来看看怎么改变窗口亮度。十分简单,只需改变窗口属性中的屏幕亮度(screenBrightness
)一项。让我们直接来看代码:
/**
* 当前窗口亮度
* 范围为0~1.0,1.0时为最亮,-1为系统默认设置
*/
var Activity.windowBrightness
get() = window.attributes.screenBrightness
set(brightness) {
//小于0或大于1.0默认为系统亮度
window.attributes = window.attributes.apply {
screenBrightness = if (brightness > 1.0 || brightness < 0) -1.0F else brightness
}
}
改变窗口亮度的上下文必须是Activity
,所以我给Activity
加了一个扩展属性windowBrightness
,它的值就是当前的窗口亮度,改变它的值就可以改变窗口亮度。它的范围是0~1.0,从0到1.0亮度逐渐增大;如果赋值为-1,那就表示跟随系统的亮度。
使用起来也很简单:
tvWindowBright.text = "当前窗口亮度=$windowBrightness"
sbWindowBright.progress = if (windowBrightness > 0) (windowBrightness * 100).toInt() else 0
sbWindowBright.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
windowBrightness = progress.toFloat() / 100F
tvWindowBright.text