亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android 屏幕亮度調節方法詳解

2020-04-11 12:41:51
字體:
來源:轉載
供稿:網友

屏幕亮度自動調節
主要是從Sensor分析之中分離出來分析LIGHT 光線感應器,因此就分析一下自動調節屏幕亮度(手機隨著光線的強度自我調節,也就是在亮的光線下屏幕自動調亮一些,暗的時候就自動調暗一些,省得光線對眼睛有刺激).....

    (本人從歷經挫折才大概了解流程),現在就開始講一下流程,如果有不對地方希望牛人指出來。。。

    先從Sttings入手吧,在diaplay中有屏幕亮度調節,有一個進度調,上面有一個checkbox(自動調節屏幕亮度的),

那么我們當然去找settings下的文件開始看了,先找到
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);
                }
。。。。。
   }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情一级二级| 国产欧美日韩免费看aⅴ视频| 亚洲天堂av电影| 国产成人在线精品| 最近2019中文字幕在线高清| 日韩有码在线播放| 亚洲精品小视频在线观看| 成人黄色生活片| 欧美激情奇米色| 91精品国产沙发| 亚洲一区二区三区四区在线播放| 日韩精品在线观看一区二区| 久久大大胆人体| 91午夜理伦私人影院| 亚洲国产日韩欧美在线99| 精品性高朝久久久久久久| 国产精品欧美激情在线播放| 在线观看国产欧美| 欧美一级大胆视频| 91精品久久久久久久久久另类| 日韩三级成人av网| 国产精品综合不卡av| 91精品综合久久久久久五月天| 亚洲精品丝袜日韩| 欧美日韩一区二区免费视频| 91sa在线看| 久久久中精品2020中文| 国产日韩在线精品av| 91色视频在线导航| 欧美一区二区大胆人体摄影专业网站| 日韩激情av在线免费观看| 美女久久久久久久| 精品视频在线播放| 人人爽久久涩噜噜噜网站| 欧美wwwwww| 成人黄色影片在线| www欧美xxxx| 日韩精品久久久久久福利| 亚洲xxxxx电影| 日韩资源在线观看| 日韩在线观看免费网站| 久久久亚洲影院| 亚洲综合第一页| 日韩小视频网址| 亚洲成人激情小说| 精品国产欧美成人夜夜嗨| 久久免费观看视频| 在线电影中文日韩| 亚洲福利视频免费观看| 中文字幕av日韩| 欧美大尺度激情区在线播放| 亚洲国产美女精品久久久久∴| 国产亚洲精品一区二区| 久久久久久久久爱| 亚洲丝袜一区在线| 国产欧美一区二区三区久久人妖| 亚洲free嫩bbb| 日本一区二区三区在线播放| 成人www视频在线观看| 成人国产精品一区| 欧美视频在线免费看| 91精品国产乱码久久久久久蜜臀| 欧美性猛交xxxx免费看漫画| 国产精品96久久久久久又黄又硬| 色偷偷av一区二区三区乱| 精品久久久久久电影| 日本午夜人人精品| 久久久国产精品x99av| 国产精品黄色影片导航在线观看| 国产午夜精品一区理论片飘花| 久久人91精品久久久久久不卡| 日韩国产精品亚洲а∨天堂免| 成人做爰www免费看视频网站| 亚洲乱码国产乱码精品精| 九九精品视频在线| 日韩精品免费在线观看| 色哟哟网站入口亚洲精品| 欧美成人中文字幕在线| 高清一区二区三区四区五区| 国产主播欧美精品| 久久在线免费视频| 有码中文亚洲精品| 国产精品日日摸夜夜添夜夜av| 亚洲精品乱码久久久久久按摩观| 久久精品男人天堂| 亚洲精品综合久久中文字幕| 日韩免费在线看| 亲子乱一区二区三区电影| 久久韩剧网电视剧| 欧美性猛交xxxx久久久| 性欧美在线看片a免费观看| 国产亚洲精品久久久久久牛牛| 国产91精品久久久久久| 777午夜精品福利在线观看| 精品一区二区三区电影| 亚洲天堂色网站| 欧美色道久久88综合亚洲精品| 一区二区三区视频在线| 亚洲黄色在线观看| 欧美体内谢she精2性欧美| 精品久久在线播放| 精品国产视频在线| 久久久精品2019中文字幕神马| 日韩av色综合| 色伦专区97中文字幕| 欧美最顶级的aⅴ艳星| 国产日韩欧美在线视频观看| 欧美日韩国产精品一区二区不卡中文| 日韩中文字幕视频| 成人精品一区二区三区| 中文字幕日韩电影| 亚洲人成电影在线| 国产精品欧美日韩一区二区| 欧美黑人视频一区| 久久夜色精品国产欧美乱| 欧美午夜片在线免费观看| 热久久99这里有精品| 欧美高清自拍一区| 97在线视频国产| 国产精品第一区| 麻豆乱码国产一区二区三区| 日韩av在线免费播放| 精品国产鲁一鲁一区二区张丽| 欧美性在线视频| 精品国产电影一区| 国产午夜精品久久久| 亚洲天堂日韩电影| 亚洲va欧美va在线观看| 国产精品扒开腿做爽爽爽男男| 日韩经典中文字幕在线观看| 亚洲天堂色网站| 最新国产成人av网站网址麻豆| 久久精品视频va| 国产精品激情av在线播放| 日韩禁在线播放| 日韩精品中文在线观看| 欧美丰满片xxx777| 国产精品福利在线观看网址| 欧美性极品少妇精品网站| 成人av.网址在线网站| 欧美性xxxx在线播放| 国产精品久久一区| 国产一区二区三区在线播放免费观看| 国产精品看片资源| 亚洲国产中文字幕在线观看| 中文字幕久热精品视频在线| 午夜剧场成人观在线视频免费观看| 国产91久久婷婷一区二区| www.亚洲免费视频| 亚洲欧美国产精品专区久久| 中文一区二区视频| 最新日韩中文字幕| 亚洲视频在线看| 8090理伦午夜在线电影| 国产综合久久久久| 亚洲色图综合久久| 亚洲天堂第一页| 亚洲欧美三级伦理| 成人精品一区二区三区| 国产精品免费视频xxxx| 最近中文字幕2019免费| 国产精品美女免费| 成人免费视频网| 亚洲国产精品久久|