屏幕亮度自动调节:
主要是从Sensor分析之中分离出来分析liGHT 光线感应器,因此就分析一下自动调节屏幕亮度(手机随着光线的强度自我调节,也就是在亮的光线下屏幕自动调亮一些,暗的时候就自动调暗一些,省得光线对眼睛有刺激).....
(本人从历经挫折才大概了解流程),现在就开始讲一下流程,如果有不对地方希望牛人指出来。。。
先从Sttings入手吧,在diaplay中有屏幕亮度调节,有一个进度调,上面有一个checkBox(自动调节屏幕亮度的),
DiaplaySettings.java文件以及display_setting.xml文件,display_setting.xml里面能找到相应的组件,但是 在DiaplaySettings.java文件中却不能找到调用相应组件的代码,
那么我们再到settings中去找,能找到BrightnessPreference.java文件,没错这个文件就是自动调节亮度的文件,我们先看看代码:
构造函数中有mautomaticAvailable = context.getResources().getBoolean(com.androID.internal.R.bool.config_automatic_brightness_available);
开始以为mautomaticAvailabl的值(为true,在config.xml中)是判断是否自动调节亮度,因为在我跟进到PowerManagerService.java中,在initInThread() 中
mUseSoftwareautoBrightness = resources.getBoolean(
com.androID.internal.R.bool.config_automatic_brightness_available);
if (mUseSoftwareautoBrightness) {
mautoBrightnessLevels = resources.getIntArray(
com.androID.internal.R.array.config_autoBrightnessLevels);//得到自动化调节的值调用 getautoBrightnessValue(int sensorValue,int[] values) 方法
mLcdBacklightValues = resources.getIntArray(
com.androID.internal.R.array.config_autoBrightnessLcdBacklightValues);
mbuttonBacklightValues = resources.getIntArray(
com.androID.internal.R.array.config_autoBrightnessbuttonBacklightValues);
mKeyboardBacklightValues = resources.getIntArray(。。。。。
。。。。。。这里看起来好像是当mUseSoftwareautoBrightness为true时就取得config.xml文件config_autoBrightnessLevels的值,再去根据光线自动调节,但是mautomaticAvailabl的值只是说明有没有自动调节屏幕的功能(比如说你将config.xml文件的config_automatic_brightness_available的值改为false,编译替换framework-res.apk那么在屏幕亮度调节中将没有自动调节的checkBox),这也能解释构造函数一开始就初始化mautomaticAvailabl的值。
接下来在BrightnessPreference.java文件中有onProgressChanged,onStartTrackingtouch(Seekbar seekbar),onStopTrackingtouch(Seekbar seekbar)方法,这些一看也能懂就不介绍了,在onBindDialogVIEw(VIEw vIEw)方法中有
mCheckBox = (CheckBox)vIEw.findVIEwByID(R.ID.automatic_mode);
if (mautomaticAvailable) {//当有自动调节功能
mCheckBox.setonCheckedchangelistener(this);//为checkBox添加监听事件
try {
moldautomatic = Settings.System.getInt(getContext().getContentResolver(),
Settings.System.SCREEN_BRIGHTnesS_MODE);
。。。。。。
主要看public voID onCheckedChanged(Compoundbutton buttonVIEw,boolean isChecked) {
setMode(isChecked ? Settings.System.SCREEN_BRIGHTnesS_MODE_autoMATIC
: Settings.System.SCREEN_BRIGHTnesS_MODE_MANUAL);
if (!isChecked) {
setBrightness(mSeekbar.getProgress() + MINIMUM_BACKliGHT);
}
}
这里才是你选择自动调节亮度的checkBox,如果选择则setMode(Settings.System.SCREEN_BRIGHTnesS_MODE_autoMATIC);并将数据存放到数据库中。
这里是重点:这里有个数据库,当监测到数据库中的值发生改变时也就是变为Settings.System.SCREEN_BRIGHTnesS_MODE_autoMATIC时,就会跳到
powerManagerService.java的initInThread()中ContentResolver resolver = mContext.getContentResolver();
Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI,null,
"(" + Settings.System.name + "=?) or ("
+ Settings.System.name + "=?) or ("
+ Settings.System.name + "=?) or ("
+ Settings.System.name + "=?) or ("
+ Settings.System.name + "=?) or ("
+ Settings.System.name + "=?) or ("
+ Settings.System.name + "=?)",
new String[]{STAY_ON_WHILE_PLUGGED_IN,SCREEN_OFF_TIMEOUT,DIM_SCREEN,XEC_DLS_CONTRol,
SCREEN_BRIGHTnesS_MODE,WINDOW_ANIMATION_SCALE,Transition_ANIMATION_SCALE},
null);
mSettings = new ContentqueryMap(settingsCursor,Settings.System.name,true,mHandler);
SettingsObserver settingsObserver = new SettingsObserver();
mSettings.addobserver(settingsObserver);
数据库中数据发生改变时触发事件的发生。
在 powerManagerService.java的systemReady()(只在开机调用一次就不再调用)中
if (mUseSoftwareautoBrightness) {
Log.i("frist","frist="+"aaaa");
mlightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_liGHT);
enablelightSensor(true);
}
而mUseSoftwareautoBrightness是在initInThread()线程中取得了true值,那么就到enablelightSensor(true);方法去看
if (enable) {
mSensorManager.registerListener(mlightListener,mlightSensor,
SensorManager.SENSOR_DELAY_norMAL);
}
如果传递来的值为true也就是enable=true就监听而且用匹配屏幕方向变化的感应SENSOR_DELAY_norMAL。
再看mlightListener事件:SensorEventListener mlightListener = new SensorEventListener() {
public voID onSensorChanged(SensorEvent event) {
synchronized (mlocks) {
int value = (int)event.values[0];//从event里面获取当前数据
Log.i("value","value="+value);
long milliseconds = SystemClock.elapsedRealtime();
if (mDeBUGlightSensor) {
Slog.d(TAG,"onSensorChanged: light value: " + value);
}
mHandler.removeCallbacks(mautoBrightnessTask);
if (mlightSensorValue != value) {//mlightSensorValue是当前的屏幕亮度
if (mlightSensorValue == -1 ||
milliseconds < mLastScreenOnTime + mlightSensorWarmupTime) {
// process the value immediately if screen has just turned on
lightSensorChangedLocked(value);
} else {
// delay processing to debounce the sensor
mlightSensorPendingValue = value;//mlightSensorPendingValue是准备要设置的亮度
mHandler.postDelayed(mautoBrightnessTask,liGHT_SENSOR_DELAY);//到mautoBrightnessTask线程去完成自动调节
}
} else {
mlightSensorPendingValue = -1;
}
}
}
当前屏幕亮度肯定不等与-1,所以做else中的mHandler.postDelayed(mautoBrightnessTask,liGHT_SENSOR_DELAY),那么我们再到mautoBrightnessTask
线程看:private Runnable mautoBrightnessTask = new Runnable() {
public voID run() {
synchronized (mlocks) {
int value = (int)mlightSensorPendingValue;
Log.i("mlightSensorPendingValue","mlightSensorPendingValue"+mlightSensorPendingValue);
if (value >= 0) {
mlightSensorPendingValue = -1;
lightSensorChangedLocked(value);
}
}
}
};就是不断的去调用lightSensorChangedLocked(value)
private voID lightSensorChangedLocked(int value) {
。。。。。。。
if (mlightSensorValue != value) {
mlightSensorValue = value;
if ((mPowerState & BATTERY_LOW_BIT) == 0) {
// Use light sensor value no matter it is in a dock or not.
int lcdValue = getautoBrightnessValue(
value,
mLcdBacklightValues);// 取得mLcdBacklightValues里面的值
int buttonValue = getautoBrightnessValue(value,mbuttonBacklightValues);
int keyboardValue;
if (mKeyboardVisible) {
keyboardValue = getautoBrightnessValue(value,mKeyboardBacklightValues);
} else {
keyboardValue = 0;
}
。。。
if (mautoBrightessEnabled && mScreenBrightnessOverrIDe < 0) {//设置屏幕亮度
mScreenBrightness.setTargetLocked(lcdValue,autoBRIGHTnesS_ANIM_STEPS,
INITIAL_SCREEN_BRIGHTnesS,(int)mScreenBrightness.curValue);
}
。。。。。
}
以上是内存溢出为你收集整理的android 屏幕亮度调节方法详解全部内容,希望文章能够帮你解决android 屏幕亮度调节方法详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)