Skip to content

实践-亮度调节

一、具体需求

  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) {
    }
}

Released under the MIT License.