日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android 如何實現亮度自動調節

瀏覽:23日期:2022-09-19 18:55:50

下拉狀態欄有個亮度的進度條,如果開啟了亮度自動調節開關,會隨著周圍光線變化,這個進度條也會隨著變化,接下來就是看看這個功能是如何實現的。

源碼版本

基于 Android 9.0 分析。

BrightnessDialog,位于:frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java

ToggleSliderView,位于:frameworks/base/packages/SystemUI/src/com/android/systemui/settings/ToggleSliderView.java

DisplayPowerController,位于:frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

AutomaticBrightnessController,位于:frameworks/base/services/core/java/com/android/server/display/AutomaticBrightnessController.java

BrightnessMappingStrategy,

概述

狀態欄里亮度頁面是 BrightnessDialog,其中進度條設置是 ToggleSliderView,亮度自動調節主要是 DisplayPowerController 和 AutomaticBrightnessController 兩個類,當亮度發生變化時,如果關聯到 ToggleSliderView,用的是 ContentObserver,Uri 為 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ。

源碼梳理1、BrightnessDialog#onCreate:

@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //省略部分代碼 mBrightnessController = new BrightnessController(this, icon, slider);}2、這里進行了 BrightnessController 初始化,來看下:

public BrightnessController(Context context, ImageView icon, ToggleSlider control) { //省略部分代碼 mBrightnessObserver = new BrightnessObserver(mHandler); //省略部分代碼}

又進行了 BrightnessObserver 初始化:

/** ContentObserver to watch brightness **/private class BrightnessObserver extends ContentObserver { //省略部分代碼 private final Uri BRIGHTNESS_FOR_VR_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR); //Add By WuXiaolong for AutomaticBrightness private final Uri BRIGHTNESS_ADJ_URI = Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ); public BrightnessObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { onChange(selfChange, null); } @Override public void onChange(boolean selfChange, Uri uri) { if (selfChange) return; if (BRIGHTNESS_MODE_URI.equals(uri)) { mBackgroundHandler.post(mUpdateModeRunnable); mBackgroundHandler.post(mUpdateSliderRunnable); } //省略部分代碼 //Add By WuXiaolong for AutomaticBrightness else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) { mBackgroundHandler.post(mUpdateSliderRunnable); } else { mBackgroundHandler.post(mUpdateModeRunnable); mBackgroundHandler.post(mUpdateSliderRunnable); } for (BrightnessStateChangeCallback cb : mChangeCallbacks) { cb.onBrightnessLevelChanged(); } } public void startObserving() { final ContentResolver cr = mContext.getContentResolver(); cr.unregisterContentObserver(this); //省略部分代碼 cr.registerContentObserver(BRIGHTNESS_FOR_VR_URI,false, this, UserHandle.USER_ALL); //Add By WuXiaolong for AutomaticBrightness cr.registerContentObserver(BRIGHTNESS_ADJ_URI,false, this, UserHandle.USER_ALL); } public void stopObserving() { final ContentResolver cr = mContext.getContentResolver(); cr.unregisterContentObserver(this); }}

其實我目前下載的源碼,這塊功能是不全的,我已經加上了,哪里進行 BrightnessObserver 的 ContentObserver 注冊呢?

3、回到 BrightnessDialog#onStart:

@Overrideprotected void onStart() { super.onStart(); mBrightnessController.registerCallbacks(); MetricsLogger.visible(this, MetricsEvent.BRIGHTNESS_DIALOG);}4、調用mBrightnessController.registerCallbacks();最終走到 mStartListeningRunnable:

private final Runnable mStartListeningRunnable = new Runnable() { @Override public void run() { //BrightnessObserver 注冊 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. mUpdateModeRunnable.run(); mUpdateSliderRunnable.run(); mHandler.sendEmptyMessage(MSG_ATTACH_LISTENER); }};

當亮度有變化時,會走 BrightnessObserver#onChange,最終走到:

private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mExternalChange = true; try { switch (msg.what) {//省略部分代碼case MSG_UPDATE_SLIDER: updateSlider(msg.arg1, msg.arg2 != 0); break;//省略部分代碼default: super.handleMessage(msg); } } finally { mExternalChange = false; } }};

走 updateSlider方法,到 :

private void animateSliderTo(int target) { if (!mControlValueInitialized) { // Don’t animate the first value since it’s default state isn’t mea mControl.setValue(target); mControlValueInitialized = true; } //省略部分代碼}5、跳到 ToggleSliderView#setValue:

@Overridepublic void setValue(int value) { //這里正是修改進度條 mSlider.setProgress(value); if (mMirror != null) { mMirror.setValue(value); }}

接下來就是看看亮度自動調節主要的兩個類 DisplayPowerController 和 AutomaticBrightnessController。DisplayPowerController 屬于 Display 模塊,其控制設備屏幕亮滅、背光、與Power關系密切,這里主要看下屏幕亮度的控制這方面的邏輯。

6、首先,在 DisplayManagerService 中初始化 DisplayPowerController,如下:

private final class LocalService extends DisplayManagerInternal { @Override public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager) { synchronized (mSyncRoot) { //省略部分代碼 mDisplayPowerController = new DisplayPowerController( mContext, callbacks, handler, sensorManager, blanker); } mHandler.sendEmptyMessage(MSG_LOAD_BRIGHTNESS_CONFIGURATION); }7、接著看下 DisplayPowerController 構造方法,如下:

public DisplayPowerController(Context context, DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager, DisplayBlanker blanker) { //省略部分代碼 mUseSoftwareAutoBrightnessConfig = resources.getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); //省略部分代碼 if (mUseSoftwareAutoBrightnessConfig) { //省略部分代碼 mBrightnessMapper = BrightnessMappingStrategy.create(resources); if (mBrightnessMapper != null) { mAutomaticBrightnessController = new AutomaticBrightnessController(this, handler.getLooper(), sensorManager, mBrightnessMapper, lightSensorWarmUpTimeConfig, mScreenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp, hysteresisLevels); } else { mUseSoftwareAutoBrightnessConfig = false; } } //省略部分代碼 mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting(); mTemporaryAutoBrightnessAdjustment = Float.NaN; //省略部分代碼}

由于亮屏之后屏幕自動亮度才會生效,所以在亮屏的時候,流程會走到 DisplayPowerController 中的核心函數 updatePowerState():

private void updatePowerState() { // Update the power state request. //省略部分代碼 final boolean autoBrightnessAdjustmentChanged = updateAutoBrightnessAdjustment(); if (autoBrightnessAdjustmentChanged) { mTemporaryAutoBrightnessAdjustment = Float.NaN; } // Use the autobrightness adjustment override if set. final float autoBrightnessAdjustment; if (!Float.isNaN(mTemporaryAutoBrightnessAdjustment)) { autoBrightnessAdjustment = mTemporaryAutoBrightnessAdjustment; mAppliedTemporaryAutoBrightnessAdjustment = true; } else { autoBrightnessAdjustment = mAutoBrightnessAdjustment; mAppliedTemporaryAutoBrightnessAdjustment = false; } boolean hadUserBrightnessPoint = false; // Configure auto-brightness. if (mAutomaticBrightnessController != null) { hadUserBrightnessPoint = mAutomaticBrightnessController.hasUserDataPoints(); mAutomaticBrightnessController.configure(autoBrightnessEnabled,mBrightnessConfiguration,mLastUserSetScreenBrightness / (float) PowerManager.BRIGHTNESS_ON,userSetBrightnessChanged, autoBrightnessAdjustment,autoBrightnessAdjustmentChanged, mPowerRequest.policy); } // Apply auto-brightness. boolean slowChange = false; if (brightness < 0) { float newAutoBrightnessAdjustment = autoBrightnessAdjustment; if (autoBrightnessEnabled) { brightness = mAutomaticBrightnessController.getAutomaticScreenBrightness(); newAutoBrightnessAdjustment = mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment(); } if (brightness >= 0) { // Use current auto-brightness value and slowly adjust to changes. brightness = clampScreenBrightness(brightness); if (mAppliedAutoBrightness && !autoBrightnessAdjustmentChanged) {slowChange = true; // slowly adapt to auto-brightness } // Tell the rest of the system about the new brightness. Note that we do this // before applying the low power or dim transformations so that the slider // accurately represents the full possible range, even if they range changes what // it means in absolute terms. putScreenBrightnessSetting(brightness); mAppliedAutoBrightness = true; } else { mAppliedAutoBrightness = false; } if (autoBrightnessAdjustment != newAutoBrightnessAdjustment) { // If the autobrightness controller has decided to change the adjustment value // used, make sure that’s reflected in settings. putAutoBrightnessAdjustmentSetting(newAutoBrightnessAdjustment); } } else { mAppliedAutoBrightness = false; } //省略部分代碼}

接下來分別看看 autoBrightnessAdjustment 和 newAutoBrightnessAdjustment 怎么來的?

autoBrightnessAdjustment 是來自 mTemporaryAutoBrightnessAdjustment 或 mAutoBrightnessAdjustment 賦值,mAutoBrightnessAdjustment 在第 7 步mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();有初始化,看下 getAutoBrightnessAdjustmentSetting():

private float getAutoBrightnessAdjustmentSetting() { final float adj = Settings.System.getFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT); return Float.isNaN(adj) ? 0.0f : clampAutoBrightnessAdjustment(adj);}

繼續看下 clampAutoBrightnessAdjustment:

private static float clampAutoBrightnessAdjustment(float value) { return MathUtils.constrain(value, -1.0f, 1.0f);}

這里注意下 MathUtils.constrain() 表示百分比縮放函數,比如 MathUtils.constrain(0.5, 0, 255) 表示 (255-0)*0.5。

這樣了解了 autoBrightnessAdjustment,接下來看 newAutoBrightnessAdjustment。

8、回到 DisplayPowerController#updatePowerState(),

看到 newAutoBrightnessAdjustment 調用了 AutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment(),最終是到了 BrightnessMapper#getAutoBrightnessAdjustment() 其中 mAutoBrightnessAdjustment 變量,賦值是在 BrightnessMapper#setAutoBrightnessAdjustment:

@Overridepublic boolean setAutoBrightnessAdjustment(float adjustment) { adjustment = MathUtils.constrain(adjustment, -1, 1); if (adjustment == mAutoBrightnessAdjustment) { return false; } if (DEBUG) { Slog.d(TAG, 'setAutoBrightnessAdjustment: ' + mAutoBrightnessAdjustment + ' => ' +adjustment); PLOG.start('auto-brightness adjustment'); } mAutoBrightnessAdjustment = adjustment; computeSpline(); return true;}9、BrightnessMapper#setAutoBrightnessAdjustment

這個方法調用又回到了 AutomaticBrightnessController#setAutoBrightnessAdjustment:

private boolean setAutoBrightnessAdjustment(float adjustment) { return mBrightnessMapper.setAutoBrightnessAdjustment(adjustment);}

AutomaticBrightnessController#setAutoBrightnessAdjustment調用是來到 AutomaticBrightnessController#configure()方法:

public void configure(boolean enable, @Nullable BrightnessConfiguration configuration, float brightness, boolean userChangedBrightness, float adjustment, boolean userChangedAutoBrightnessAdjustment, int displayPolicy) { // While dozing, the application processor may be suspended which will prevent us from // receiving new information from the light sensor. On some devices, we may be able to // switch to a wake-up light sensor instead but for now we will simply disable the sensor // and hold onto the last computed screen auto brightness. We save the dozing flag for // debugging purposes. boolean dozing = (displayPolicy == DisplayPowerRequest.POLICY_DOZE); boolean changed = setBrightnessConfiguration(configuration); changed |= setDisplayPolicy(displayPolicy); if (userChangedAutoBrightnessAdjustment) { changed |= setAutoBrightnessAdjustment(adjustment); } if (userChangedBrightness && enable) { // Update the brightness curve with the new user control point. It’s critical this // happens after we update the autobrightness adjustment since it may reset it. changed |= setScreenBrightnessByUser(brightness); } final boolean userInitiatedChange = userChangedBrightness || userChangedAutoBrightnessAdjustment; if (userInitiatedChange && enable && !dozing) { prepareBrightnessAdjustmentSample(); } changed |= setLightSensorEnabled(enable && !dozing); if (changed) { updateAutoBrightness(false /*sendUpdate*/); }}

AutomaticBrightnessController#configure()調用來到了 DisplayPowerController #updatePowerState()。

這樣也知道了 newAutoBrightnessAdjustment,繼續 putAutoBrightnessAdjustmentSetting:

private void putAutoBrightnessAdjustmentSetting(float adjustment) { mAutoBrightnessAdjustment = adjustment; Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adjustment, UserHandle.USER_CURRENT);}

就調到第 4 步 BrightnessObserver#onChange,進度條隨之變化,Over!

以上就是Android 如何實現亮度自動調節的詳細內容,更多關于Android 亮度自動調節的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲乱亚洲高清| 国产成人黄色| 国产色播av在线| 国产精品99视频| 在线天堂资源www在线污| 91综合网人人| 国产一区清纯| 最新国产精品视频| 国产亚洲精品美女久久| 1024精品久久久久久久久| 欧美激情亚洲| 日本精品在线中文字幕| 国产精品视区| 国产精品va| 日韩免费高清| 黑丝一区二区| 国产精品久久久久久久久久白浆 | 久久婷婷av| 中文不卡在线| 精品三区视频| 亚洲影视一区二区三区| 激情综合婷婷| 日韩中文字幕亚洲一区二区va在线| 日本成人中文字幕| 九色porny丨国产首页在线| 视频一区在线播放| 美女尤物国产一区| 亚洲最大av| 亚洲高清不卡| 精品女同一区二区三区在线观看| 久久成人精品| 亚洲第一区色| 久久男人天堂| 国产精品xvideos88| 玖玖精品视频| 婷婷激情久久| 黑森林国产精品av| 国产三级一区| 日本精品一区二区三区在线观看视频| 欧美亚洲国产激情| 国产精品xx| 91嫩草精品| 日韩美女国产精品| 亚洲欧美久久久| 中文精品视频| 亚洲专区在线| 99国产一区| 欧美网站在线| 日韩一区二区免费看| 欧美日韩国产免费观看视频| 久久精品欧洲| 精品中文在线| 成人国产精品一区二区免费麻豆| 国产日韩亚洲欧美精品| 欧美在线观看天堂一区二区三区| 蜜臀av在线播放一区二区三区| 欧美日韩免费看片| 桃色av一区二区| 中文在线а√在线8| 成人国产精品| 日韩欧美二区| 久久久精品久久久久久96| 92国产精品| 欧美一区二区性| 日韩精品一卡二卡三卡四卡无卡 | 亚洲精品成a人ⅴ香蕉片| 麻豆亚洲精品| 婷婷综合一区| 久久av资源| 欧美黄色网页| 亚洲欧美综合| 亚洲精品美女91| 久久av综合| 久久中文亚洲字幕| 男女性色大片免费观看一区二区 | 国产精品v日韩精品v欧美精品网站| 国产精品最新自拍| 老司机精品在线| 亚洲午夜91| 人人精品人人爱| 国产精品流白浆在线观看| 日韩大片在线播放| 日韩影院免费视频| 成人在线免费观看网站| 欧美天堂亚洲电影院在线观看| 四虎国产精品免费久久| 久久久久久久欧美精品| 亚洲大片在线| 国产女人18毛片水真多18精品| 国内精品伊人| 蜜臀av一区二区在线免费观看| 国产福利亚洲| 久色成人在线| 亚洲91精品| 欧美精品成人| 欧美日韩国产免费观看| 久久精品国产成人一区二区三区| 国产精品99免费看| 精品国产aⅴ| 蜜桃久久av一区| 最近高清中文在线字幕在线观看1| 天堂俺去俺来也www久久婷婷| 999国产精品| 成人精品国产亚洲| 国产精品色在线网站| 亚洲资源网站| 在线精品一区二区| 欧美网站在线| 精品一区在线| 青青青免费在线视频| 国产精品欧美大片| 欧美一区二区三区免费看| 热久久国产精品| 蜜臀久久久99精品久久久久久| 亚洲第一精品影视| 正在播放日韩精品| 都市激情国产精品| 成人污污视频| 综合日韩av| 999国产精品999久久久久久| 日韩欧美二区| 99久久www免费| 久久久蜜桃一区二区人| 日韩中文在线电影| 桃色一区二区| 久久网站免费观看| 国产精品普通话对白| 蜜桃av一区二区在线观看| 亚洲人成在线影院| 欧美日韩亚洲一区在线观看| 亚洲免费一区三区| 欧美日韩亚洲一区二区三区在线| 国产精品亚洲产品| 国产一区二区三区不卡视频网站 | 91亚洲自偷观看高清| 蜜桃av.网站在线观看| 欧美日中文字幕| 亚洲日本在线观看视频| 国产精品久久久久久久久久久久久久久| 久久av网站| 久久九九99| 青青国产91久久久久久| 美女视频黄久久| 日韩另类视频| 综合激情婷婷| 欧美91在线| 久久影视一区| 国产日韩高清一区二区三区在线 | 免费精品视频| 美女久久久精品| 国产一区二区高清| 九九99久久精品在免费线bt| av一区二区高清| 麻豆国产91在线播放| 玖玖精品视频| 久久久亚洲欧洲日产| 日韩国产一区二区| 婷婷精品视频| 久久精品国产精品亚洲毛片| 亚洲另类av| 精品国产18久久久久久二百| 国产香蕉精品| 国产日产高清欧美一区二区三区 | 日本免费一区二区视频| 一区二区精彩视频| 自拍日韩欧美| 国产女优一区| 欧美69视频| 欧美中文一区二区| 久久精品1区| 日韩免费av| 国产美女高潮在线观看| 国产精品国产三级国产在线观看| 欧美伊人影院| 91国内精品| 日韩av中文字幕一区二区| 亚洲综合小说| 日韩精品91亚洲二区在线观看| 久久夜色精品| 亚洲乱码一区| 女人天堂亚洲aⅴ在线观看| 国产综合精品一区| 久久久久国产精品一区二区| 国产伊人久久| 樱桃视频成人在线观看| 国产欧美一区二区三区精品酒店| 精品免费视频| 999久久久91| 婷婷综合成人| 欧美黄色一区二区| 欧美sss在线视频| 日韩精品一二区| 国产乱码精品一区二区三区亚洲人| 国产精品久久久久久久久久妞妞 | 色婷婷久久久| 亚洲午夜在线| 日韩一区网站| 黄色在线网站噜噜噜| 美国三级日本三级久久99| 麻豆精品新av中文字幕|