Android P自动背光原理

目录:
1,sensor 基本架构图
2,Lsensor UI 手动设定
3,Lsensor 自动算法

关键词:
lux : 环境光线
nit: 屏幕亮度
backlight:UI 中设定进度条显示数字

1-sensor 基本架构图
Light sensor 属于sensor 其中的一个设备, 因此架构都一样,light sensor 有I2C 接口,spi 接口,要从硬件上选择一种就可以, 最好选择I2C , 进行i2c通信就可以获取lux 值

图片.png

Lsensor 数据获取步骤(获取lux 可定制开发app)
Setp0:获取传获取传感器对象
Setp1:感器管理器对象
Setp2:定义事件监听器-----》下面有给出在原生code 中获取lux(onSensorChanged)
Setp3:注册事件监听器
Setp4:卸载事件监听器

图片.png

2,Lsensor UI 手动设定
在原生android P code 中,亮度的调节分为三中方式

1) 在设置中手动设定亮度方式

2) 在system UI 中手动设定亮度

3) 在播放视频时候设定亮度

上面的几种方式最后调用都到了updatePowerState(), 手动更改亮度,对自动亮度的调整有影响

2.1 System UI , 设置中进行了设定亮度

frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java
图片.png

最后背光的修改都要走到下面的函数

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java
private void animateScreenBrightness(int target, int rate) {……….}

3,Lsensor 自动算法
基本思路:
Stetp 1:创建三条曲线 lux---nits---backlight

mNitsToBacklightSpline = Spline.createSpline(nits, normalizedBacklight);
mBacklightToNitsSpline = Spline.createSpline(normalizedBacklight, nits);
mBrightnessSpline = Spline.createSpline(lux, nits);----->最重要的曲线, lux-->nits (由nits->bightlight)

Step 2:
手动调整了亮度-> addUserDataPoint(float lux, float brightness) ->重新调整曲线(mBrightnessSpline = Spline.createSpline(lux, nits))--->记录用户调整值,根据用户的习惯,重新拟合曲线

Step 3:
最后调用animateScreenBrightness,这里利用设定背光时间rate,逐步更新,达到不闪烁

3.1 code 流程
创建曲线:

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java
frameworks/base/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
public DisplayPowerController(Context context,
        DisplayPowerCallbacks callbacks, Handler handler,SensorManager sensorManager, DisplayBlanker blanker) {
      mBrightnessMapper = BrightnessMappingStrategy.create(resources);
}

下面都是制造商的配置数组, 然后根据配置建立样条曲线

int[] brightnessLevelsBacklight---->config_autoBrightnessLcdBacklightValues
float[] luxLevels------------------>config_autoBrightnessLevels
float[] brightnessLevelsNits------->config_autoBrightnessDisplayValuesNits
float[] nitsRange------------------>config_screenBrightnessNits
int[] backlightRange -------------->config_screenBrightnessBacklight
图片.png
mBrightnessSpline = Spline.createSpline(lux, nits);

用户手动调整了亮度:

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java
frameworks/base/services/core/java/com/android/server/display/AutomaticBrightnessController.java
DisplayPowerController--> BrightnessMappingStrategy.create()-AutomaticBrightnessController-----> mAutomaticBrightnessController.configure
图片.png

下图进行了对比,默认曲线有用户调整后曲线的情况:


图片.png

问题:什么时候用户清除配置,reset 动作 (感觉nrea 不需要考虑)
1, 切换用户
2, BrightnessConfigure 重新配置
3, 屏幕由交互状态进入非交互状态时,这个是有display 状态决定

3.2 animateScreenBrightness 分析

有上面可以知道event 携带参数lux ,根据lux (利用拟合曲线)算出backlight 值,最后由animateScreenBrightness(int target, int rate)函数进行更新,在参数中就有目标target, 更新rate (分fast,slow)。
如果rate = 0 ,直接更新,可能闪屏。
如果rate > 0 ,根据rate 速度逐步进行更新背光值

frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java

rate 配置:


图片.png

更新目标背光流程:

animateScreenBrightness-->mScreenBrightnessRampAnimator.animateTo(target, rate)--->postAnimationCallback();--->mAnimationCallback-->mProperty.setValue(mObject, mCurrentValue);--->

最后走到了:DisplayPowerState.java: setValue-->setScreenBrightness


图片.png
frameworks/base/services/core/java/com/android/server/display/DisplayPowerState.java:
图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容