Android护眼模式功能小记
最近自己在做一个小说阅读器,看到某阅有护眼模式功能,别人都有,我怎么能没有?

现在这功能已经不稀奇了,很多手机都带有这个功能。
实现起来不难,用一个蒙版遮在界面上面就行。
至于蒙版,可以用Window实现,也可以只用套个FrameLayout实现。
Window实现的优点是,支持全局,切可以覆盖状态栏。缺点是需要权限声明,而悬浮窗权限在国内这些手机上相当不好搞,需要适配很多机型。
FrameLayout不支持全局,当用户离开你App就失效了。而且无法覆盖状态栏,App内所有的View都是在状态栏下面的。不过FrameLayout不需要任何权限请求。
我选择的是FrameLayout,因为我只需要在阅读页面实现护眼模式。
蒙版有了,接下来只需要给蒙版设置一个颜色。这个颜色使得让屏幕看起来发黄,然后这个功能就成了。(老实说,我对这功能是否真的有保护眼睛的作用表示怀疑)
可是颜色并不是我擅长的。我不知道怎么搭配红绿蓝可以得到一个让屏幕看起来略微发黄的颜色。
这时候,就该展现搜索引擎的威力了。毕竟我们要学会站在巨人的肩膀上。
我打开了google,搜索了“护眼模式”、“护眼模式原理”、“Android 护眼模式原理”等等都没有得到想要的结果,全是一些乱七八糟的新闻,要不就是广告。
不过我没有绝望,因为我很坚强。

接下来我在应用商店发现了一堆护眼App,其中不乏宣称百分用户使用的。

反编译之后,发现是这个样子的..

不过你混淆的了代码,你混淆的了manifest吗?
打开manifest,不出所料,使用的悬浮窗权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
这样事情就变得简单了。全局搜索getSystemService("window")就找到了其使用WindowManager的地方,然后一步步跟下去,终于找到其设置背景颜色的地方。
根据这个app的代码,我整理出了下面的工具方法,有需要的直接拿去用:
/**
* 过滤蓝光
* @param blueFilterPercent 蓝光过滤比例[10-80]
* */
public static @ColorInt int getColor(int blueFilterPercent)
{
int realFilter = blueFilterPercent;
if (realFilter < 10)
{
realFilter = 10;
}
else if (realFilter > 80)
{
realFilter = 80;
}
int a = (int) (realFilter / 80f * 180);
int r = (int) (200 - (realFilter / 80f) * 190);
int g = (int) (180 - ( realFilter / 80f) * 170);
int b = (int) (60 - realFilter / 80f * 60);
return Color.argb(a, r, g, b);
}
一般blueFilterPercent给个30左右的值就可以了。
贴两张效果图。
开启护眼模式前:

开启护眼模式后:

效果还是有。
博客:https://www.zhoumingyao.cn/
Android护眼模式功能小记的更多相关文章
- 最全面的AndroidStudio配置指南总结-包括护眼模式
使用AndroidStudio开发APP已有半年多的时间了,从刚开始的不习惯到慢慢适应再到逐渐喜欢上AndroidStudio,中间的过程颇有一番曲折,现在把自己对AndroidStudio的配置心得 ...
- chrome护眼模式
chrome护眼模式 使用stylish插件: 学习:https://jingyan.baidu.com/article/b907e627f74df146e6891c67.html 插件下载:http ...
- MyEclipse护眼模式、字体大小的调整
1.Eclipse改变背景颜色 Windows menu --> Preference General -> Editors -> Text Editors(click), 在底部 ...
- Eclipse改变外观,护眼模式
1.Eclipse改变背景颜色 Windows menu --> Preference General -> Editors -> Text Editors(click), 在右下 ...
- win7、win8.1淡绿色护眼模式设置
Win7设置: 右击桌面 -> 个性化 -> 窗口颜色 -> 高级外观设置 选中 -> 项目:窗口 颜色:其他 修改:色调 饱和度 亮度 红 绿 蓝 添加到自定义 ...
- 修改hbuilder背景颜色为护眼模式
复制以下代码,保存为.tmTheme文件导入HBuilder <?xml version="1.0" encoding="UTF-8"?> < ...
- eclipse设置护眼模式,就是设置为黑色背景,
效果如上图 首先下载jar包,然后放到下面的目录,然后打开eclipse然后选择哪个dark的那个主题就可以了 然而这里只是设置软件部分的, 代码的背景和高亮显示,是在另外一个地方设置, 一般是下载e ...
- ubuntu下使用redshift开启护眼模式
前面提到flux这东西在一些机器上并不能work,而且也找到了一些关于他不能work的线索(戳这里看原因).根据这些线索我们发现用flux不行了,得换用redshift,那好吧,我们就来装redshi ...
- [工具] 护眼宝 – 傻瓜版屏幕蓝光过滤应用[Win/Android]
护眼宝 是一款 Windows.Android 下的屏幕蓝光过滤工具,傻瓜式操作,支持智能模式.疲劳提醒,可以有效的保护视力及减小夜间使用电脑.手机对睡眠对影响. 来自发现频道. 类似应用有很多了 ...
随机推荐
- 【Android Developers Training】 69. 视图切换的淡入淡出效果
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能
AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能 核心代码如下 1.index.html <!DOCTYPE html> < ...
- 使用matplotlib快速绘图
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表.让我们先来看一个简单的例子: # -*- coding: utf-8 -*- import num ...
- twemproxyMemcache协议解析探索——剖析twemproxy代码正编补充
memcache是一种和redis类似的高速缓存服务器,但是memcache只提供键值对这种简单的存储方式,相对于redis支持的存储方式多样化,memcache就比较简单了.memcache通过tc ...
- AugularJS从入门到实践(一)
前 言 前端 AngularJS是为了克服HTML在构建应用上的不足而设计的.(引用百度百科) AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷.Angu ...
- Java 实现FTP上传和下载
1. 目前网上开源的FTP Client主要有JFTP.FTP4.edtFtpjJ和Apache.FTPClient. 2. jftp地址:http://www.jmethods.com/ 3. ed ...
- Ambari安装之部署3个节点的HA分布式集群
前期博客 Ambari安装之部署单节点集群 其实,按照这个步骤是一样的.只是按照好3个节点后,再做下HA即可. 部署3个节点的HA分布式集群 (1)添加机器 和添加服务的操作类似,如下图 之后的添加a ...
- xdu_1077:循环节长度
题意很简单,就是给出p,q,求p/q的循环节长度. 由循环小数的循环部分的值等于等比数列求和的值S,列公式得到最简分数分母的值.最终得10^x%q==1(其中q为经过modify之后的值).搞清这些之 ...
- 【Python】debug工具-pdb(转)
Debug功能对于developer是非常重要的,python提供了相应的模块pdb让你可以在用文本编辑器写脚本的情况下进行debug. pdb是python debugger的简称. 常用的一些命令 ...
- MySQL学习笔记(四):存储引擎的选择
一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...