最近自己在做一个小说阅读器,看到某阅有护眼模式功能,别人都有,我怎么能没有?
现在这功能已经不稀奇了,很多手机都带有这个功能。
实现起来不难,用一个蒙版遮在界面上面就行。
至于蒙版,可以用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左右的值就可以了。
贴两张效果图。
开启护眼模式前:
开启护眼模式后:
效果还是有。