转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/122882722
本文出自【赵彦军的博客】
最近接到一个做护眼模式的需求,要求是在Android App 全局,在任何一个页面都显示。
在做需求之前要先弄清楚几个概念
蓝光
短波蓝光是波长处于400nm-480nm之间具有相对较高能量的光线。该波长内的蓝光会使眼睛内的黄斑区毒素量增高,严重威胁我们的眼底健康。蓝光诱发致盲眼病,最有效的解决方案是对电视进行贴膜处理。防蓝光贴膜技术已经很成熟,成本很低,可以有效阻止蓝光穿透。
在这里,特别提出一点,蓝光并不都是有害蓝光,真正有害的是波长400到450以内的蓝光,而480到500纳米之间的蓝光有一种调整生物节律的作用,睡眠、情绪、记忆力等都与之相关,对人体反而是有益的。而且短波蓝光是不是一定会对人眼产生伤害,这与照射强度与照射时间有关,当照度达到一定程度后,持续两个小时以上,才有可能对视网膜产生损害。
护眼模式
简单来说,就是把屏幕发出的光,过滤掉对人体有害的蓝光,就是护眼模式。
实现原理
第一个问题,怎么过滤蓝光。
/**
* 过滤蓝光,过滤蓝光比例,一般传30
*/
private fun calculateFilterColor(blueFilterPercent: Int = 30): Int {
var realFilter = blueFilterPercent
if (realFilter < 10) {
realFilter = 10
} else if (realFilter > 80) {
realFilter = 80
}
val a = (realFilter / 80f * 180).toInt()
val r = (200 - realFilter / 80f * 190).toInt()
val g = (180 - realFilter / 80f * 170).toInt()
val b = (60 - realFilter / 80f * 60).toInt()
return Color.argb(a, r, g, b)
}
Activity 怎么设置蓝光,也很简单就是 在 decorView 增加一个前景色
//过滤蓝光,获取对眼睛健康的颜色
val color = calculateFilterColor()
activity.window.decorView.foreground = ColorDrawable(color)
那么怎么运用到所有的 activity ,一种思路是在 BaseActivity onResume 方法,统一设置护眼模式。但是有个问题,有些 activity 是在第三方 sdk 中,并不会继承我们的 BaseActivity 。 我选择的方案是,在 Application 里注册监听器。如下:
class App : Application() {
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityResumed(activity: Activity) {
val color = UtilBlueEye.calculateFilterColor()
activity.window.decorView.foreground = ColorDrawable(color)
}
})
}
}
这样就能运用到所有的 Activity。
怎么关闭蓝光呢? 同样的套路,在 decorView 增加一个透明前景色。
//关闭蓝光
activity.window.decorView.foreground = ColorDrawable(Color.TRANSPARENT)
上面都是针对单个 activity 设置护眼,如何对单独的 View 设置?也是超级简单,对 view 设置前景色即可,代码如下:
val color = UtilBlueEye.calculateFilterColor()
view.foreground = ColorDrawable(color)
activity 设置了护眼模式,并不会影响到 Dialog 上,如何处理 Dialog 的护眼模式,也是很简单。
val color = UtilBlueEye.calculateFilterColor()
dialog.window?.decorView?.foreground = ColorDrawable(color)
好了,护眼模式做完了,关电脑,下班回家。