最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android 屏幕亮度調(diào)節(jié)方法詳解

 更新時(shí)間:2012年11月22日 16:12:35   作者:  
分析一下自動(dòng)調(diào)節(jié)屏幕亮度手機(jī)隨著光線的強(qiáng)度自我調(diào)節(jié),也就是在亮的光線下屏幕自動(dòng)亮一些,暗的時(shí)候就自動(dòng)調(diào)暗一些,本文將詳細(xì)介紹android 屏幕亮度調(diào)節(jié)

屏幕亮度自動(dòng)調(diào)節(jié)
主要是從Sensor分析之中分離出來分析LIGHT 光線感應(yīng)器,因此就分析一下自動(dòng)調(diào)節(jié)屏幕亮度(手機(jī)隨著光線的強(qiáng)度自我調(diào)節(jié),也就是在亮的光線下屏幕自動(dòng)調(diào)亮一些,暗的時(shí)候就自動(dòng)調(diào)暗一些,省得光線對(duì)眼睛有刺激).....

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

    先從Sttings入手吧,在diaplay中有屏幕亮度調(diào)節(jié),有一個(gè)進(jìn)度調(diào),上面有一個(gè)checkbox(自動(dòng)調(diào)節(jié)屏幕亮度的),

那么我們當(dāng)然去找settings下的文件開始看了,先找到
DiaplaySettings.java文件以及display_setting.xml文件,display_setting.xml里面能找到相應(yīng)的組件,但是 在DiaplaySettings.java文件中卻不能找到調(diào)用相應(yīng)組件的代碼,

那么我們再到settings中去找,能找到BrightnessPreference.java文件,沒錯(cuò)這個(gè)文件就是自動(dòng)調(diào)節(jié)亮度的文件,我們先看看代碼:
構(gòu)造函數(shù)中有mAutomaticAvailable = context.getResources().getBoolean(com.android.internal.R.bool.config_automatic_brightness_available);
開始以為mAutomaticAvailabl的值(為true,在config.xml中)是判斷是否自動(dòng)調(diào)節(jié)亮度,因?yàn)樵谖腋M(jìn)到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);//得到自動(dòng)化調(diào)節(jié)的值調(diào)用 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(。。。。。
。。。。。。這里看起來好像是當(dāng)mUseSoftwareAutoBrightness為true時(shí)就取得config.xml文件config_autoBrightnessLevels的值,再去根據(jù)光線自動(dòng)調(diào)節(jié),但是mAutomaticAvailabl的值只是說明有沒有自動(dòng)調(diào)節(jié)屏幕的功能(比如說你將config.xml文件的config_automatic_brightness_available的值改為false,編譯替換framework-res.apk那么在屏幕亮度調(diào)節(jié)中將沒有自動(dòng)調(diào)節(jié)的checkbox),這也能解釋構(gòu)造函數(shù)一開始就初始化mAutomaticAvailabl的值。

接下來在BrightnessPreference.java文件中有onProgressChanged,onStartTrackingTouch(SeekBar seekBar),onStopTrackingTouch(SeekBar seekBar)方法,這些一看也能懂就不介紹了,在onBindDialogView(View view)方法中有
mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);
        if (mAutomaticAvailable) {//當(dāng)有自動(dòng)調(diào)節(jié)功能
            mCheckBox.setOnCheckedChangeListener(this);//為checkbox添加監(jiān)聽事件
            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);
        }
    }
這里才是你選擇自動(dòng)調(diào)節(jié)亮度的checkbox,如果選擇則setMode(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);并將數(shù)據(jù)存放到數(shù)據(jù)庫中。

這里是重點(diǎn):這里有個(gè)數(shù)據(jù)庫,當(dāng)監(jiān)測到數(shù)據(jù)庫中的值發(fā)生改變時(shí)也就是變?yōu)镾ettings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC時(shí),就會(huì)跳到
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);
數(shù)據(jù)庫中數(shù)據(jù)發(fā)生改變時(shí)觸發(fā)事件的發(fā)生。

在 powerManagerService.java的systemReady()(只在開機(jī)調(diào)用一次就不再調(diào)用)中
 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就監(jiān)聽而且用匹配屏幕方向變化的感應(yīng)SENSOR_DELAY_NORMAL。
再看mLightListener事件:SensorEventListener mLightListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            synchronized (mLocks) {
                int value = (int)event.values[0];//從event里面獲取當(dāng)前數(shù)據(jù)
                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是當(dāng)前的屏幕亮度
                    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是準(zhǔn)備要設(shè)置的亮度
                        mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);//到mAutoBrightnessTask線程去完成自動(dòng)調(diào)節(jié)
                    }
                } else {
                    mLightSensorPendingValue = -1;
                }
            }
        }
當(dāng)前屏幕亮度肯定不等與-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);
                }
            }
        }
    };就是不斷的去調(diào)用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) {//設(shè)置屏幕亮度
                    mScreenBrightness.setTargetLocked(lcdValue, AUTOBRIGHTNESS_ANIM_STEPS,
                            INITIAL_SCREEN_BRIGHTNESS, (int)mScreenBrightness.curValue);
                }
。。。。。
   }

相關(guān)文章

  • Android VideoView類實(shí)例講解

    Android VideoView類實(shí)例講解

    本文主要介紹Android VideoView類,這里對(duì)VideoView類詳細(xì)說明了使用方法,以及示例代碼,有興趣的朋友可以參考下,希望能幫助Android 開發(fā)的朋友
    2016-08-08
  • 基于RecyclerView實(shí)現(xiàn)橫向GridView效果

    基于RecyclerView實(shí)現(xiàn)橫向GridView效果

    這篇文章主要為大家詳細(xì)介紹了基于RecyclerView實(shí)現(xiàn)橫向GridView效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Flutter應(yīng)用框架搭建實(shí)現(xiàn)屏幕適配方案詳解

    Flutter應(yīng)用框架搭建實(shí)現(xiàn)屏幕適配方案詳解

    移動(dòng)設(shè)備多樣性,特別是Android的碎片化嚴(yán)重,存在各種各樣的分辨率,flutter跨平臺(tái)開發(fā)又需要同時(shí)支持Android和IOS,為盡可能的還原設(shè)計(jì)圖效果提升用戶的體驗(yàn),根據(jù)設(shè)計(jì)稿設(shè)計(jì)屏幕ui的時(shí)候我們需要考慮到屏幕適配的問題
    2022-11-11
  • Android 應(yīng)用的歡迎界面實(shí)現(xiàn)代碼

    Android 應(yīng)用的歡迎界面實(shí)現(xiàn)代碼

    本文主要介紹Android 應(yīng)用歡迎界面的開發(fā),這里提供實(shí)現(xiàn)方法和實(shí)現(xiàn)代碼以供大家參考,有需要的朋友可以參考下
    2016-07-07
  • Android檢測手機(jī)多點(diǎn)觸摸點(diǎn)數(shù)的方法

    Android檢測手機(jī)多點(diǎn)觸摸點(diǎn)數(shù)的方法

    這篇文章主要為大家詳細(xì)介紹了Android檢測手機(jī)多點(diǎn)觸摸點(diǎn)數(shù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • android中Invalidate和postInvalidate的更新view區(qū)別

    android中Invalidate和postInvalidate的更新view區(qū)別

    Android中實(shí)現(xiàn)view的更新有兩組方法,一組是invalidate,另一組是postInvalidate,其中前者是在UI線程自身中使用,而后者在非UI線程中使用,感興趣的朋友可以了解下哦
    2013-01-01
  • android 瀏覽器之多窗口方案詳解

    android 瀏覽器之多窗口方案詳解

    android 瀏覽器之多窗口方案詳細(xì)介紹,需要的朋友可以過來參考下
    2013-07-07
  • Android數(shù)據(jù)類型之間相互轉(zhuǎn)換系統(tǒng)介紹

    Android數(shù)據(jù)類型之間相互轉(zhuǎn)換系統(tǒng)介紹

    一些初學(xué)Android的朋友可能會(huì)遇到JAVA的數(shù)據(jù)類型之間轉(zhuǎn)換的苦惱;本文將為有這類需求的朋友解決此類問題
    2012-11-11
  • Kotlin原理詳析之拓展函數(shù)

    Kotlin原理詳析之拓展函數(shù)

    kotlin中的擴(kuò)展函數(shù),實(shí)際上是在自己的類中添加了一個(gè)static final方法,將需要擴(kuò)展的類,在使用的時(shí)候作為第一個(gè)參數(shù)傳入方法中,然后使用,這篇文章主要給大家介紹了關(guān)于Kotlin原理詳析之拓展函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Android使用SQLite數(shù)據(jù)庫的示例

    Android使用SQLite數(shù)據(jù)庫的示例

    本篇文章主要介紹了Android使用SQLite數(shù)據(jù)庫的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01

最新評(píng)論

涿州市| 镇坪县| 兴安盟| 桑植县| 甘洛县| 昂仁县| 怀柔区| 宝坻区| 磴口县| 海兴县| 双江| 新昌县| 呼和浩特市| 绥中县| 兴和县| 剑川县| 大新县| 芜湖县| 玛曲县| 理塘县| 东乌珠穆沁旗| 邵阳县| 肃宁县| 永城市| 兴化市| 新密市| 唐海县| 老河口市| 建宁县| 湘西| 大新县| 卢龙县| 龙游县| 平昌县| 玉屏| 南平市| 日喀则市| 增城市| 宝鸡市| 阿鲁科尔沁旗| 基隆市|