最近自己在做一個小說閱讀器,看到某閱有護眼模式功能,別人都有,我怎麼能沒有? <! more 現在這功能已經不稀奇了,很多手機都帶有這個功能。 實現起來不難,用一個蒙版遮在界面上面就行。 至於蒙版,可以用Window實現,也可以只用套個FrameLayout實現。 Window實現的優點是,支持全局 ...
最近自己在做一個小說閱讀器,看到某閱有護眼模式功能,別人都有,我怎麼能沒有?
現在這功能已經不稀奇了,很多手機都帶有這個功能。
實現起來不難,用一個蒙版遮在界面上面就行。
至於蒙版,可以用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/