RK3399_Android 7.1 亮度调节原理
亮度调节原理
亮度调节框对应代码:
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屏幕亮度调节