本文基于工作中自动背光笔记扩充了下,记录下自动背光算法。
基于Android 8.1, 代码可参看 http://androidxref.com/8.1.0_...
Android 9加入了所谓的机器学习算法,根据用户调节时亮度和光感重新生成曲线,
自动背光时的滑动条不再是调节adjustment值,暂时不想写了。。。
Android 10简单看了下,加入了对单个应用的支持,暂时不想写了。。。

一、简单说说

简单的说,其实背光调节就三大步,建曲线,采样去抖,计算亮度

1. 建曲线

Brightness 1 ^   |   |   |             。   |            。   |           。   +       。min+   。   |   0+--+---+-------------------> lux           min

建曲线这个其实就是建立一个lux对应的brightness的曲线,这样就可以根据光感传来的lux值,计算出对应的亮度为多少。
(安卓的算法需要Brightness比lux多一个值,所以上图曲线两者的min值不对应)

2. 采样去抖

这个就是采集一段时间内的lux值,然后根据这段时间的lux,算出这段时间的lux值。
当然考虑到抖动(如有闪电等突然变化很大,然后又恢复的情况;或者周期性的明暗明暗变化等情况),所以需要去抖,
默认安卓是要求光照稳定在-0.8~+1.1倍之间,并且持续一段时间(由暗到亮是4秒,由亮到暗是8s)

3. 计算亮度

安卓的算法流程
1). 开自动背光时,下拉通知条为一系数,假设为x,其区间为[-1.0, 1.0], 应用层为除以1024,浮点精度

2). 计算背光时,先计算出lux对应的亮度,假设为y,其区间为[0.0, 1.0], 考虑为用户会微调,所以然后再处理用户微调(1中的x)

3). 最终计算屏幕亮度z向下取整

4). 然后再处理z的极值区间,例如我们设置的11~255, 18~255

用公式表示即为

$$\mathbf{z = y^{3^{-x}}*255, x\in[-1.0, 1.0], y\in[0.0, 1.0], z\in[min, 255]}$$

公式中3表示为gamma3.0,后面是3的-x次方,即$3^{-x}$

举个例子,

                                        /出地库        光照稳定在-0.8~1.1倍之间4S  /  |         |                       |/  +---------+-----------------------+--------------10lux   5000lux         开始改变屏幕,假设屏幕亮度从55 -> 255,                         那么亮度调节完需要时间为((255-55)/rampRate)*16.6ms, 约3.3S                     (16.6ms是一个vsync时间,rampRate默认为1,可以更改进行速率调节)

二、说点代码