改變虛擬導航欄(navigation bar)背景色及圖標顏色

衆所周知,安卓系統中存在着虛擬導航欄,它們不是實體按鍵,而是通過軟件實現的。一般而言,虛擬導航欄是長成下面這樣的:
在這裏插入圖片描述
系統中默認的虛擬導航欄的背景色是黑色,按鍵的顏色是白色。但是如果軟件需要自定義主題色的話,很多時候,我們都希望它的背景色能跟主題色保持一樣。那我們怎麼實現呢?

<item name="android:navigationBarColor">@color/colorPrimary</item>

在styles文件中的Theme中指定上面的屬性就可以改變導航欄的背景色了。
在這裏插入圖片描述
其實在谷歌推出Android5.0的時候,官方文檔中有下面的這張圖片:
在這裏插入圖片描述
虛擬導航欄的背景色的屬性是navigationBarColor,所以要想改變導航欄的顏色就要改變它的屬性值,而且我們從圖片中還可以得到另外一個信息:軟件的主題色與導航欄的顏色是沒有關聯的。所以如果要想實現虛擬導航欄的背景色跟隨App的主題色改變就需要我們在代碼中手動設置。

/**
     * Set the navigation bar's color.
     *
     * @param window The window.
     * @param color  The navigation bar's color.
     */
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    public static void setNavBarColor(@NonNull final Window window, @ColorInt final int color) {
        window.setNavigationBarColor(color);
    }

需要注意的是:該方法是在Android5.0中才加入的,而且在設置之前還需要判斷手機是否支持虛擬導航欄。

/**
     * Return whether the navigation bar visible.
     *
     * @return {@code true}: yes<br>{@code false}: no
     */
    public static boolean isSupportNavBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            WindowManager wm = (WindowManager) BaseApplication.getsApplication().getSystemService(Context.WINDOW_SERVICE);
            if (wm == null) return false;
            Display display = wm.getDefaultDisplay();
            Point size = new Point();
            Point realSize = new Point();
            display.getSize(size);
            display.getRealSize(realSize);
            return realSize.y != size.y || realSize.x != size.x;
        }
        boolean menu = ViewConfiguration.get(BaseApplication.getsApplication()).hasPermanentMenuKey();
        boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
        return !menu && !back;
    }

現在我們能夠自由地控制導航欄的背景色了,但是有的時候我們可能還需要改變虛擬導航欄圖標的顏色。
如果我們把背景色設置成白色,那麼會是什麼效果呢?
在這裏插入圖片描述
我原以爲系統如果識別中背景色是白色會自動把三大金剛按鍵圖標的顏色改成深色,很顯然是我想多了。那有什麼方法可以解決這種問題嗎?
在谷歌Material Design設計文檔中有這樣一張圖片:
在這裏插入圖片描述
圖片上顯示,虛擬導航欄有兩種模式:Dark和Light。如果背景色是黑色,那按鍵的顏色就是白色的;如果背景色是白色,那按鍵的顏色就是深色。按照這個說法,想必肯定是提供了相關的API。
如果要想改變導航欄按鍵的顏色,需要設置屬性:windowLightNavigationBar爲true,也可以在代碼中調用方法:

View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

這樣設置以後導航欄按鍵的顏色就變成深色了。需要注意的是,該API是在27中才加入的。

總結一下:

  1. 設置導航欄背景色:設置navigationBarColor屬性即可;
  2. 改變導航欄按鍵顏色爲深色:設置標誌位View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,或者屬性中設置windowLightNavigationBar爲true;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章