【RK3399 Android 7.1 / KEN】亮度调节原理


亮度调节原理

亮度调节框对应代码:

frameworks\base\packages\SystemUI\src\com\android\systemui\settings\BrightnessDialog.java

  • 在 onCreate() 中主要是对亮度调节框进行设置,最重要的是 实例化 BrightnessController 对象
    mBrightnessController = new BrightnessController(this, icon, slider);

  • 然后是在 onStart() 中为 mBrightnessController 对象 注册了 Callback 回调函数:
    mBrightnessController.registerCallbacks();
    调节亮度调节框 的时候,就会调用该对象的方法。

亮度调节对应代码:

frameworks\base\packages\SystemUI\src\com\android\systemui\settings\BrightnessController.java

  • 前面说过,BrightnessDialog.java 代码中有 mBrightnessController.registerCallbacks();
    这句代码调用了 BrightnessController 类中的 registerCallbacks() 函数

  • 具体来看一下 registerCallbacks() 方法里面做了什么:

public void registerCallbacks() {
    if (mListening) {
        return;
    }

    // 应该是检测环境亮度的,主要用于自动亮度模式下,对于手动调节的模式不适用,可以忽略
    mBrightnessObserver.startObserving();
    // 跟踪用户的行为,应该是跟踪用户是否有对亮度进行过调节
    mUserTracker.startTracking();
    // Update the slider and mode before attaching the listener so we don't
    // receive the onChanged notifications for the initial values.
    updateMode(); // 更新亮度调节模式(一般分为自动模式和手动模式)
    updateSlider(); // 更新滑块的值

    // 给调节滑块设置 onChanged 监听
    mControl.setOnChangedListener(this);
    // 标志监听状态,true 表示监听中
    mListening = true;
}

其中最重要的是对 调节滑块 进行监听:mControl.setOnChangedListener(this);

  • 对于亮度的设置主要在 onChanged() 函数,当用户调节亮度调节框时就会调用该函数,所以接下来重点分析一下该函数:
public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
    // 根据是否为自动亮度模式,设置 Icon
    updateIcon(mAutomatic);
    if (mExternalChange) return;

    // 但处于手动模式的时候,进入 if 语句
    if (!mAutomatic) {
        // 'val' 是亮度值
        final int val = value + mMinimumBacklight;
        // 调用 setBrightness(val),将亮度值设为 'val'
        setBrightness(val);
        // 当系统没有跟踪用户当前行为时,执行 if,把亮度值写入系统
        if (!tracking) {
            AsyncTask.execute(new Runnable() {
                    public void run() {
                        Settings.System.putIntForUser(mContext.getContentResolver(),
                                Settings.System.SCREEN_BRIGHTNESS, val,
                                UserHandle.USER_CURRENT);
                    }
                });
        }
    } else {
        final float adj = value / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1;
        setBrightnessAdj(adj);
        if (!tracking) {
            AsyncTask.execute(new Runnable() {
                public void run() {
                    Settings.System.putFloatForUser(mContext.getContentResolver(),
                            Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj,
                            UserHandle.USER_CURRENT);
                }
            });
        }
    }
    
    for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
        cb.onBrightnessLevelChanged();
    }
}
  • onChanged() 中调用了 setBrightness(val) 设置亮度,看一下 setBrightness():
private void setBrightness(int brightness) {
    try {
        // mPower 是一个 IPowerManager 接口,这里调用了 setTemporaryScreenBrightnessSettingOverride
        // 来设置亮度值,最终实现是在PowerManagerService
        mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
    } catch (RemoteException ex) {
    }
}

以上就是亮度调节的大概流程

想继续深究下去,可以参考这篇文章:
Android屏幕亮度调节

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值