Android護眼模式功能小記


最近自己在做一個小說閱讀器,看到某閱有護眼模式功能,別人都有,我怎么能沒有?

image

現在這功能已經不稀奇了,很多手機都帶有這個功能。

實現起來不難,用一個蒙版遮在界面上面就行。

至於蒙版,可以用Window實現,也可以只用套個FrameLayout實現。

Window實現的優點是,支持全局,切可以覆蓋狀態欄。缺點是需要權限聲明,而懸浮窗權限在國內這些手機上相當不好搞,需要適配很多機型。

FrameLayout不支持全局,當用戶離開你App就失效了。而且無法覆蓋狀態欄,App內所有的View都是在狀態欄下面的。不過FrameLayout不需要任何權限請求。

我選擇的是FrameLayout,因為我只需要在閱讀頁面實現護眼模式。

蒙版有了,接下來只需要給蒙版設置一個顏色。這個顏色使得讓屏幕看起來發黃,然后這個功能就成了。(老實說,我對這功能是否真的有保護眼睛的作用表示懷疑)

可是顏色並不是我擅長的。我不知道怎么搭配紅綠藍可以得到一個讓屏幕看起來略微發黃的顏色。

這時候,就該展現搜索引擎的威力了。畢竟我們要學會站在巨人的肩膀上。

我打開了google,搜索了“護眼模式”、“護眼模式原理”、“Android 護眼模式原理”等等都沒有得到想要的結果,全是一些亂七八糟的新聞,要不就是廣告。

不過我沒有絕望,因為我很堅強。

image

接下來我在應用商店發現了一堆護眼App,其中不乏宣稱百分用戶使用的。

image

反編譯之后,發現是這個樣子的..

image

不過你混淆的了代碼,你混淆的了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左右的值就可以了。

貼兩張效果圖。

開啟護眼模式前:

image

開啟護眼模式后:

image

效果還是有。

博客:https://www.zhoumingyao.cn/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM