Android如何实现全局的护眼模式

转载请标明出处: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)

好了,护眼模式做完了,关电脑,下班回家。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值