基于kotlin的使用SeekBar调节应用内亮度
项目想要实现应用内有一个专门控制整个应用的亮度的页面。(其实直接用系统自带的亮度调节就可以了,但有遇到这样的需求就也写一下吧)主要有两种实现方法,第一种为调节当前页面的亮度,第二种为调节系统亮度。由于第二种需要Android6以后需要动态申请权限比较麻烦,这里直接使用第一种方式实现应用内多个页面亮度共同调节。
最终效果如下:
亮度调节工具类
创建一个工具类,控制当前页面的亮度
object BrightnessUtil {
/**
* 获取系统屏幕亮度
*/
fun getBrightness(context: Context): Int {
var brightness = -1
val resolver = context.contentResolver
try {
brightness = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS)
} catch (e: SettingNotFoundException) {
e.printStackTrace()
}
return brightness
}
/**
* 获取系统最大屏幕亮度
*/
fun getMaxBrightness(context: Context): Int {
val brightnessSettingMaximumId = context.resources.getIdentifier(
"config_screenBrightnessSettingMaximum",
"integer",
"android"
)
return context.resources.getInteger(brightnessSettingMaximumId)
}
/**
* 调节当前屏幕亮度
*/
fun SetActivityLight(lightnumber: Int, activity: Activity) {
val window = activity.window //对当前窗口进行设置
val layoutparams = window.attributes //获取窗口属性为后面亮度做铺垫作用
layoutparams.screenBrightness =
lightnumber / 255.0f //用窗口管理(自定义的)layoutparams获取亮度值,android亮度值处于在0-255之间的整形数值
window.attributes = layoutparams //设置当前窗口屏幕亮度
}
}
在Activity中使用:
这里使用SeekBar滑动控制屏幕的亮度
对于SeekBar的监听使用方法如下:
lightBar.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(lightBar: SeekBar?, progress: Int, p2: Boolean) {
BrightnessUtil.SetActivityLight(progress, this@BrightSetActivity)
}
override fun onStartTrackingTouch(lightBar: SeekBar?) {
}
override fun onStopTrackingTouch(lightBar: SeekBar?) {
}
在Activity中使用:
lightBar为控件id,lightValue为显示数值的TexView的id,这个light为全局亮度在后面会提到
lightBar.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(lightBar: SeekBar?, progress: Int, p2: Boolean) {
lightLevel.text = progress.toString()
light = progress
BrightnessUtil.SetActivityLight(progress, this@BrightSetActivity)
}
override fun onStartTrackingTouch(lightBar: SeekBar?) {}
override fun onStopTrackingTouch(lightBar: SeekBar?) {}
} )
最后,以上完成的仅仅是对单个页面的亮度控制,想要实现APP内多个界面的亮度控制
需设置一个全局的变量保存SeekBar滑动设置的值,这里创建了一个自己的Application类,
在整个程序的生命周期内都不会被回收,用以存储全局亮度。同时也可以通过这个方法存储一个全局的Context
class XApplication : Application() {
companion object{
@SuppressLint("StaticFieldLeak")
lateinit var context: Context
var light : Int = 0
}
override fun onCreate() {
super.onCreate()
context = applicationContext
light = BrightnessUtil.getBrightness(context)
}
}
这里我创建了一个BaseActivity使所有的Activity继承与BaseActivity,
在BaseActivity中设置后所有继承于BaseActivity的Activity都可实现设置的功能
重写了其onRestart()方法,这样每次显示页面的时候都会调用这个方法改变当前页面的亮度,实现应用内所有页面的亮度统一调节
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
override fun onRestart() {
super.onRestart()
BrightnessUtil.SetActivityLight(X7SApplication.light,this)
}
}