下拉状态栏有个亮度的进度条,如果开启了亮度自动调节开关,会随着周围光线变化,这个进度条也会随着变化,接下来就是看看这个功能是如何实现的。

源码版本

基于 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:

@Override

2、这里进行了 BrightnessController 初始化,来看下:

public BrightnessController(Context context, ImageView icon, ToggleSlider control) {

又进行了 BrightnessObserver 初始化:

/** ContentObserver to watch brightness **/

其实我目前下载的源码,这块功能是不全的,我已经加上了,哪里进行 BrightnessObserver 的 ContentObserver 注册呢?

3、回到 BrightnessDialog#onStart:

@Override

4、调用mBrightnessController.registerCallbacks();最终走到 mStartListeningRunnable:

private 

当亮度有变化时,会走 BrightnessObserver#onChange,最终走到:

private 

走 updateSlider方法,到 :

private void animateSliderTo(int target) {

5、跳到 ToggleSliderView#setValue:

@Override

接下来就是看看亮度自动调节主要的两个类 DisplayPowerController 和 AutomaticBrightnessController。DisplayPowerController 属于 Display 模块,其控制设备屏幕亮灭、背光、与Power关系密切,这里主要看下屏幕亮度的控制这方面的逻辑。

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

private 

7、接着看下 DisplayPowerController 构造方法,如下:

public DisplayPowerController(Context context,        DisplayPowerCallbacks callbacks, Handler handler,        SensorManager sensorManager, DisplayBlanker blanker) {

由于亮屏之后屏幕自动亮度才会生效,所以在亮屏的时候,流程会走到 DisplayPowerController 中的核心函数 updatePowerState():

private void updatePowerState() {

接下来分别看看 autoBrightnessAdjustment 和 newAutoBrightnessAdjustment 怎么来的?

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

private float getAutoBrightnessAdjustmentSetting() {

继续看下 clampAutoBrightnessAdjustment:

private static float clampAutoBrightnessAdjustment(float value) {

这里注意下 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

@Override

9、BrightnessMapper#setAutoBrightnessAdjustment 这个方法调用又回到了 AutomaticBrightnessController#setAutoBrightnessAdjustment:

private boolean setAutoBrightnessAdjustment(float adjustment) {

AutomaticBrightnessController#setAutoBrightnessAdjustment调用是来到 AutomaticBrightnessController#configure()方法:

public void configure(boolean enable, @Nullable BrightnessConfiguration configuration,float brightness, boolean userChangedBrightness, float adjustment,boolean userChangedAutoBrightnessAdjustment, int displayPolicy) {

AutomaticBrightnessController#configure()调用来到了 DisplayPowerController #updatePowerState()

这样也知道了 newAutoBrightnessAdjustment,继续 putAutoBrightnessAdjustmentSetting:

private void putAutoBrightnessAdjustmentSetting(float adjustment) {

就调到第 4 步 BrightnessObserver#onChange,进度条随之变化,Over!

拓展阅读

AOSP 源码下载

AOSP 源码整编单编

Android Studio 导入 AOSP 源码


苹果亮度自动调节怎么关闭_Android 亮度自动调节是如何实现的?相关推荐

  1. 苹果亮度自动调节怎么关闭_卢伟冰:Redmi K30 Pro解决安卓手机自动亮度调节痛点...

    IT之家3月30日消息 Redmi近日正式发布新款Redmi K30 Pro手机,昨日晚间Redmi品牌总经理卢伟冰也在微博上介绍了Redmi K30 Pro的一个亮点功能:360度光感自动亮度调节. ...

  2. Win11亮度无法调节解决方法(在卸载驱动,关闭自适应亮度和修改注册表都行不通的情况下)

    把独显直连关掉就行 (修好兄弟的电脑修到血压高,卸载核显驱动没用,想改注册表结果目标文件找不到,想关闭自适应亮度结果也没这选项,倒是尝试卸载独显驱动的时候发现了猫腻)

  3. android 关闭自动亮度,android – 如何打开和关闭自动亮度? (不重复)

    我只是试图打开和关闭自动亮度. 我开始使用此代码(在onCreate方法内) final ToggleButton autoBrightToggle = (ToggleButton) findView ...

  4. Android 调节屏幕亮度(当前应用和系统亮度)

    1.只改变当前程序屏幕亮度 当前屏幕亮度的取值范围:attrs.screenBrightness  0.0(暗)-1.0(亮) 需要屏幕恢复到系统亮度,可将 attrs.screenBrightnes ...

  5. android+系统屏幕亮度,android 设置系统屏幕亮度

    android 设置系统屏幕亮度 权限 /** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHT ...

  6. android 系统亮度,android 设置系统屏幕亮度

    android 设置系统屏幕亮度 权限 /** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHT ...

  7. 代码 直接调节显示设备亮度_LED显示屏参数系列,亮度是什么,如何调节,如何选择...

    亮度概念: 亮度:在给定方向上, 每单位面积上的发光强度.亮度的单位是cd/m2,读作Candela per square metre(坎德拉每平方米).有时候LED显示屏厂家会标示亮度单位为nit( ...

  8. 亮度键消失、亮度键失灵且电脑亮度为最大 | 小米 | win11 | 解决办法最最最全合集

    目录 情况说明 问题1:亮度键消失(可能仅限于小米电脑) 症状 解决方法 思路 teamviewer或向日葵远端 查看是否有需要更新的显示适配器 问题2:亮度键失灵且电脑亮度为最大(该问题适用于所有电 ...

  9. 笔记本运行linux亮度低,关于笔记本linux亮度调节

    Laptop安装linux系统后,开机默认亮度是最大,每次开机都很刺眼,开机后调节好亮度后,重启又恢复了.现在介绍可以永久设置屏幕亮度的方法,这样就不用每次开机都设置亮度那么麻烦. 调节亮度的方法是: ...

  10. 怎样取消苹果手机x的静音设置_iPhoneX拍照声音怎么关?苹果iPhoneX相机声音关闭方法...

    iPhoneX拍照声音怎么关?下面我们一起来学习下苹果iPhoneX相机声音关闭方法吧,操作其实很简单. iPhoneX无论是在相机设置还是声音设置中,都没有相机关闭选项.如果要关闭相机声音也很简单, ...

最新文章

  1. Science:睡眠剥夺影响大脑思考竟是因为蛋白质罢工了!
  2. LOAD_TYPE_VERSION_MISMATCH与TYPELOAD_NEW_VERSION错误分析
  3. Spring Boot集成Debezium监控数据库变化
  4. 获取 metadata 过程详解 - 每天5分钟玩转 OpenStack(167)
  5. eclipse php xdebug,Eclipse for php + Xdebug搭建PHP的调试环境
  6. 我同事今天被裁了,但我却涨了1万工资!
  7. ELK(ElasticSearch+LogStash+Kibana)搭建
  8. Spring Security OAuth2实现单点登录
  9. Codeforces Round #226 (Div. 2)
  10. Pareto Optimality 帕累托最优 是什么
  11. html静态页面作跳转
  12. 2020线性代数辅导讲义练习答案
  13. 视频接口详细设计方案
  14. 入行嵌入式开发若干年悟出的道理
  15. win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...
  16. php在word中生成表格,word创建表格的三种方法分别是什么
  17. python实现12306车票查询
  18. Gazebo物理仿真环境搭建 实例
  19. Spring学习之IOC容器(二)
  20. Robocup3D第一次笔记

热门文章

  1. 陈计老师《代数不等式》p15例6的别证
  2. 【网站搭建】阿里云搭建个人网站详细流程
  3. Python requests练习:爬取猫眼电影排行
  4. 服务器进不去系统system,system是什么进程 system进程可以关闭吗
  5. win10自带输入法突然变成了繁体
  6. nmds与mds的区别_聚类分析和NMDS分析的基本步骤.doc
  7. 管理者如何制定团队目标?读完这篇你就懂了.
  8. 基于法律裁判文书的法律判决预测
  9. php求圆柱体积,认识圆柱体a href=http://ruiwen.com/friend/list.php(教师中心专稿)/a -- 小学数学教学资源网...
  10. 〖强暴贴〗号称全国最大开发者网络的CSDN多次出现低级错误 验证码形同虚设 开发人员竟是MVP