手机屏幕亮度自动调节功能是如何实现的

自动亮度的原理很简单:手机中有一个光源感应器 , 系统根据光源感应器的感光强度来调整屏幕亮度 。问题的关键点在于对于某个感光强度 , 什么屏幕亮度是合适的 。
首先看一下原生系统的实现 , 系统中有一张预设的表(以G7为例)
【手机屏幕亮度自动调节功能是如何实现的】

手机屏幕亮度自动调节功能是如何实现的

文章插图
当感光强度的值位于某个区间的时候 , 屏幕亮度为该区间对应的值 。举例来说 , 当感光强度为800时 , 查表位于[400, 1000)这个区间 , 相对应的屏幕亮度为70 。
并且在原生系统的实现中 , 屏幕亮度是只变亮不变暗 。系统中维护一个当开启屏幕后感光强度的最大值 , 屏幕亮度始终保持在这个最大值对应的屏幕亮度 。只有当关闭屏幕后 , 才重新开始计算最大值 。这就是为什么大家发觉到暗处后屏幕并不会自动变暗 , 而是要关闭屏幕后再开启屏幕才能自动变暗 。
用一句话来总结原生系统的实现 , 就是很黄很暴力 。
接着调查一下CM的实现 , CM的中有很多和自动亮度相关的设置 , 但是最关键的一项设置就是允许用户去定制系统预设的表 。
用户可以任意去修改感光强度的区间范围以及个数 , 以及某个区间对应的自动亮度 。以下表为例:
手机屏幕亮度自动调节功能是如何实现的

文章插图
用户修改[1000, 3000)这一区间对应的屏幕散裂亮度为120.此后当感光强度位于这一区间时 , 屏幕亮度的值始终为120 。
对于屏幕只变量不变暗的问题 , CM也提供了相应的设置 , 使得一段时间内 , 屏幕可以自动变暗 , 这一点我会在下面MIUI的实现中详细展开 。
用一句话来总结CM系统的实现 , 就是很好很强大 。
最后回归到MIUI的实现 , 首先必须提到MIUI的一个宗旨“易用 , 人性化" 。在开始设计自动亮度的时候也是围绕这个宗旨而来的 。CM的确提供了最详细的设置和最完备的功能 , 一切交给用户 。但是一般认为绝大多数小白用户不知道如何去使用这些 , 甚至很难理解这些功能是干嘛的 , 过于复杂 。希望能够提供一个解决方案 , 即缺省的自动亮度能够满足绝大多数用户的需求 , 同时有一个简单的方式使得用户可以调节 。这个简单的宽睁方式就像用户调节手动亮度一样 。实现大略是:
(1)在MIUI中 , 采用了一个理论模型 , 这个模型是感光强度的平方根和屏幕亮度成线性关系 。
手机屏幕亮度自动调节功能是如何实现的

文章插图
如上图所示 , X轴是亮度 , Y轴是感光强度的平方根 , 其中当感光强度值为10000(平方根值为100)对应的屏幕亮度为255 , 0对应了0 。在这之间的满足一个线性关系 , 比如说如果感光强度值为6400(平方根值为80) , 计算出的屏幕亮度为200 。在1.14的版本中模型与此稍有出入 , 当时是先获取光源感应器能感应的最大感光强度 , 这个最大值对应了最高屏幕亮度 。对于N1和G7 , 这个值是10240 。对于MS , 这个值是27000 。这样对于MS来说 , 缺省的自动亮度会偏暗 。后来查阅相关资料修正为这个模型 , 一般来说在白天日光照射下感光强度为10000左右 , 这个强度应该对应屏幕最亮 , 当超过这个强度后 , 屏幕一直保持最亮 。

推荐阅读