实践-亮度调节
一、具体需求
- 进度条手动调节亮度显示
- 识别当前环境亮度自动调节亮度以显示
- 自动亮度调节过渡效果
TIP
本文档的所有代码均为kotlin
二、实现思路
- 赋予当前活动调节手机屏幕亮度的权限
- 调用手机光线传感器接口识别当前环境亮度
- 识别环境亮度后按照可视条件调节手机亮度
- 手机亮度调节缓慢过渡以免视觉疲劳不适应
- 监听seekbar的progress以实现滑动条调节屏幕亮度
三、具体实现过程
kotlin
package com.example.animationtest
import android.app.Activity
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.SeekBar
import android.widget.TextView
class BrightnessActivity : Activity(), SensorEventListener {
private lateinit var sensorManager: SensorManager
private lateinit var lightTextView: TextView
private lateinit var seekBar: SeekBar
private lateinit var seekBarText: TextView
private lateinit var btnOpen: Button
private lateinit var btnClose: Button
private val sampleSize = 20
private val sensorReadings = mutableListOf<Float>()
private var isAutoAdjust = true
private var lightLevel = 0f
companion object {
private const val TAG = "BrightnessActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_lightning_animation)
lightTextView = findViewById(R.id.current_light_text)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
seekBar = findViewById(R.id.seek_bar)
seekBarText = findViewById(R.id.seek_bar_text)
btnOpen = findViewById(R.id.btn)
btnClose = findViewById(R.id.btn_close)
repeat(sampleSize) {
sensorReadings.add(0.0f)
}
btnOpen.setOnClickListener {
isAutoAdjust = true
}
btnClose.setOnClickListener {
isAutoAdjust = false
}
seekBar.apply {
setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seek: SeekBar?, progress: Int, fromUser: Boolean) {
seekBarText.text = "当前进度: $progress %"
manuAdjustBrightness(progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
isAutoAdjust = false
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
// 延迟执行代码
}
})
}
}
override fun onResume() {
super.onResume()
val lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
lightSensor?.let {
sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
}
}
override fun onPause() {
super.onPause()
sensorManager.unregisterListener(this)
}
override fun onSensorChanged(event: SensorEvent?) {
if (event?.sensor?.type == Sensor.TYPE_LIGHT) {
lightLevel = event.values[0]
lightTextView.text = "光线水平:$lightLevel lux"
Log.d(TAG, "Light Level: $lightLevel")
sensorReadings.add(0, event.values[0])
if (sensorReadings.size > sampleSize) {
sensorReadings.removeAt(sampleSize)
}
val smoothedReading = sensorReadings.average().toFloat()
if (isAutoAdjust) {
autoAdjustBrightness(smoothedReading)
}
}
}
private fun autoAdjustBrightness(curBrightness: Float) {
Log.d(TAG, "Current Brightness: $curBrightness")
val newBrightness = curBrightness / 150.0f
val params = window.attributes
params.screenBrightness = newBrightness
window.attributes = params
val seekBarValue = (newBrightness * 100).toInt()
seekBar.progress = seekBarValue
}
private fun manuAdjustBrightness(progress: Int) {
val brightnessValue = progress.toFloat() / seekBar.max
val layoutParams = window.attributes
layoutParams.screenBrightness = brightnessValue
window.attributes = layoutParams
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
}