Android SeekBar调节应用内亮度 kotlin

基于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)

    }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值