Android中沈浸式狀態列的應用

來源:互聯網
上載者:User

標籤:lob   near   android系統   ati   dex   real   des   布局   Google   

在Android5.0版本後,Google公司為Android系統加入了很多新特性,重新整理了Android使用者的體驗度。而其中的一個新特性就是沈浸式狀態列。那麼問題來了,很多非移動端的小夥伴就要問了,什麼是沈浸式狀態列?傳統的手機狀態列是呈現出黑色條狀的,有的和手機主介面有很明顯的區別。這樣就在一定程度上犧牲了視覺寬度,介面面積變小。而沈浸式狀態列將狀態列的顏色變為透明,並將原有的布局沾滿了手機螢幕,使得狀態列和手機布局內容融為一體。下面,我們來詳細的說明沈浸式狀態列在項目中的實際應用。

要在當前的Activity介面實現沈浸式,首先我們要在oncreate方法中寫入如下代碼:

getWindow().requestFeature(Window.FEATURE_NO_TITLE);Window window = getWindow();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {   window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);   window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);   window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   window.setStatusBarColor(Color.TRANSPARENT);   window.setNavigationBarColor(Color.TRANSPARENT);}

這樣代碼就可以實現沈浸式狀態。由於沈浸式狀態列只支援5.0以上手機,所以我們在這裡進行了版本判斷。不過實際操作中,有小夥伴又遇到了新的問題。有些有虛擬按鍵的也被沉浸了,這個就會很鬱悶了。我們的構思是布局中有一個黑色的view,在有虛擬按鍵的手機上顯示出來,並且高度與虛擬按鍵一致。具體操作如下。

檢查是否具有虛擬按鍵

public static boolean hasNavBar(Context context) {        Resources res = context.getResources();        //這種方式一定要注意寫法要正確,內部應該是通過反射去調用的。        int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");        if (resourceId != 0) {            boolean hasNav = res.getBoolean(resourceId);            // check override flag            String sNavBarOverride = getNavBarOverride();            if ("1".equals(sNavBarOverride)) {                hasNav = false;            } else if ("0".equals(sNavBarOverride)) {                hasNav = true;            }            return hasNav;        } else { // fallback            if (Build.VERSION.SDK_INT >= 14) {                return !ViewConfiguration.get(context).hasPermanentMenuKey();            } else {                return false;            }        }    }

判斷虛擬按鍵欄是否重寫

private static String getNavBarOverride() {        String sNavBarOverride = null;        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            try {                Class c = Class.forName("android.os.SystemProperties");                Method m = c.getDeclaredMethod("get", String.class);                m.setAccessible(true);                sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");            } catch (Throwable e) {            }        }        return sNavBarOverride;    }

擷取虛擬按鍵欄高度

public static int getBottomStatusHeight(Context context) {        int totalHeight = getDpi(context);        int contentHeight = getScreenHeight(context);        return totalHeight - contentHeight;    }

擷取螢幕高度

 public static int getScreenHeight(Context context) {        WindowManager wm = (WindowManager) context                .getSystemService(Context.WINDOW_SERVICE);        DisplayMetrics outMetrics = new DisplayMetrics();        wm.getDefaultDisplay().getMetrics(outMetrics);        return outMetrics.heightPixels;    }
擷取螢幕原始大小高度,包括虛擬功能鍵高度
public static int getDpi(Context context) {        int dpi = 0;        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        Display display = windowManager.getDefaultDisplay();        DisplayMetrics displayMetrics = new DisplayMetrics();        @SuppressWarnings("rawtypes")        Class c;        try {            c = Class.forName("android.view.Display");            @SuppressWarnings("unchecked")            Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);            method.invoke(display, displayMetrics);            dpi = displayMetrics.heightPixels;        } catch (Exception e) {            e.printStackTrace();        }        return dpi;    }

代碼中設定布局中View的高度

if (hasNavBar(this)) {            bottomView.getViewTreeObserver().addOnGlobalLayoutListener(                    new ViewTreeObserver.OnGlobalLayoutListener() {                        // 當layout執行結束後回調此方法                        @Override                        public void onGlobalLayout() {                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) bottomView.getLayoutParams();                            params.height = getBottomStatusHeight(ActivityShopIndex.this);                            bottomView.setLayoutParams(params);                            bottomView.setVisibility(View.VISIBLE);                        }                    });        }

這樣我們就成功將虛擬按鍵欄也被沉浸的問題解決了。

作者 水木

Android中沈浸式狀態列的應用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.