EYENDLESSYOUNG/ MANUAL
微信公众号微信公众号
← 返回目录01.13.01

实践-亮度调节

部分 01 移动开发章节 Android · 实践 01/08创建 2023-10-14更新 2026-07-31阅读 –

实践-亮度调节 ​

一、具体需求 ​

  1. 进度条手动调节亮度显示
  2. 识别当前环境亮度自动调节亮度以显示
  3. 自动亮度调节过渡效果

TIP

本文档的所有代码均为kotlin

二、实现思路 ​

  1. 赋予当前活动调节手机屏幕亮度的权限
  2. 调用手机光线传感器接口识别当前环境亮度
  3. 识别环境亮度后按照可视条件调节手机亮度
  4. 手机亮度调节缓慢过渡以免视觉疲劳不适应
  5. 监听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) {
    }
}