Android 8.1 DisplayPowerController(四) 自动调节亮度(1)——流程

和手动调节亮度相比,自动调节亮度则稍微复杂些。其中涉及到多个算法。这里先笼统地介绍其流程,对涉及到的算法在下一篇文章中进行学习。

从前面的分析得到,不管是哪种背光调节方式,其最终都会在DisplayPowerController的updatePowerState()方法中进行决策,得到最终的背光值,自动背光的亮度也不例外:

private void updatePowerState() {
   
    if (brightness < 0) {
   
        if (autoBrightnessEnabled) {
   
            //得到自动亮度背光值
            brightness = mAutomaticBrightnessController.getAutomaticScreenBrightness();
        }
    }
        if (brightness >= 0) {
   
            // Use current auto-brightness value and slowly adjust to changes.
            brightness = clampScreenBrightness(brightness);
            if (mAppliedAutoBrightness && !autoBrightnessAdjustmentChanged) {
   
                slowChange = true; // slowly adapt to auto-brightness
            }
           mAppliedAutoBrightness = true;
        } else {
   
            mAppliedAutoBrightness = false;
            }
    } else {
   
        mAppliedAutoBrightness = false;
    }
}

从上面逻辑可以看出,自动调节的亮度值是通过mAutomaticBrightnessControllergetAutomaticScreenBrightness()方法得到的,所以,现在开始学习一下mAutomaticBrightnessController是什么,以及mAutomaticBrightnessController中是如何得到自动亮度的。

1.AutoBrightnessController的初始化

AutoBrightnessController是自动调节亮度的控制器,在DisplayManagerService中初始化DisplayPowerController时,就获取了该控制器实例:

/**
 * Creates the display power controller.
 */
public DisplayPowerController(Context context,
        DisplayPowerCallbacks callbacks, Handler handler,
        SensorManager sensorManager, DisplayBlanker blanker) {
   
    mSensorManager = sensorManager;
    final Resources resources = context.getResources();
    int screenBrightnessRangeMinimum = Math.min(Math.min(
            screenBrightnessSettingMinimum, mScreenBrightnessDimConfig),
            mScreenBrightnessDarkConfig);
    mUseSoftwareAutoBrightnessConfig = resources.getBoolean(
            com.android.internal.R.bool.config_automatic_brightness_available);
    int lightSensorRate = resources.getInteger(
            com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
    int initialLightSensorRate = resources.getInteger(
            com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate);
    if (initialLightSensorRate == -1) {
   
      initialLightSensorRate = lightSensorRate;
    } else if (initialLightSensorRate > lightSensorRate) {
   
      Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate ("
              + initialLightSensorRate + ") to be less than or equal to "
              + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ").");
    }
    long brighteningLightDebounce = resources.getInteger(
            com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce);
    long darkeningLightDebounce = resources.getInteger(
            com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce);
    boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean(
            com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp);
    int ambientLightHorizon = resources.getInteger(
            com.android.internal.R.integer.config_autoBrightnessAmbientLightHorizon);
    float autoBrightnessAdjustmentMaxGamma = resources.getFraction(
            com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma,
            1, 1);
    int[] brightLevels = resources.getIntArray(
            com.android.internal.R.array.config_dynamicHysteresisBrightLevels);
    int[] darkLevels = resources.getIntArray(
            com.android.internal.R.array.config_dynamicHysteresisDarkLevels);
    int[] luxLevels = resources.getIntArray(
            com.android.internal.R.array.config_dynamicHysteresisLuxLevels);
    HysteresisLevels dynamicHysteresis = new HysteresisLevels(
            brightLevels, darkLevels, luxLevels);

    if (mUseSoftwareAutoBrightnessConfig) {
   
        int[] lux = resources.getIntArray(
                com.android.internal.R.array.config_autoBrightnessLevels);
        int[] screenBrightness = resources.getIntArray(
                com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);
        int lightSensorWarmUpTimeConfig = resources.getInteger(
                com.android.internal.R.integer.config_lightSensorWarmupTime);
        final float dozeScaleFactor = resources.getFraction(
                com
  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值