背光调节,即亮度调节,根据调节方式可以分为手动调节和自动调节。而手动调节有根据调节UI不同,有式有如下几种:
- 1.在设置->显示中手动调节;
- 2.在SystemUI中手动调节;
- 3.在播放视频时上下滑动界面调节亮度.
本篇文章对手动调节亮度流程做一个总结。
1.设置-显示、SystemUI中调节亮度
Settings和SystemUI中的中亮度调节进度框都是来自于SystemUI中的BrightnessDialog,这里我们主要分析其设置亮度的功能,对于该进度框如何自定义实现不做分析。
当点击或者拖动进度框时,会回调SystemUI.BrightnessController中的onChange()
方法,在这个方法中,会对根据是否自动亮度开启、是否VR模式等分别进行处理,每个分支中,首先会通过Binder调用PMS中的setTemporyScreenBrightnessSettingOverride()
,改变临时亮度值,然后开启一个异步任务,将SettingsProvider中的对应值改变,该方法如下:
@Override
public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
int value, boolean stopTracking) {
updateIcon(mAutomatic);
if (mExternalChange) return;
if (mIsVrModeEnabled) {
//VR模式相关亮度,略去
} else if (!mAutomatic) {
//未开启自动调节亮度时
final int val = value + mMinimumBacklight;
//设置背光
setBrightness(val);
if (!tracking ) {
//将亮度值保存在SettingsProvider数据库中
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);
}
});
}
}
继续看setBrightness()
:
private void setBrightness(int brightness) {
try {
mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
} catch (RemoteException ex) {