1. 程式人生 > >android 使用全屏沉浸模式

android 使用全屏沉浸模式

這個是我自己的看官方問的總結的程式碼 親身體現可以實現

在想呼叫的地方呼叫即可

這個程式碼片段隱藏了系統條

    private void hideSystemUI() {
        
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }

這個程式碼也可以  都是我搜集和測試的一些方法

    public static void hideNavKey(Context context) {
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) {
            View v = ((Activity) context).getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = ((Activity) context).getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }

另種實現方法

    /*  
         * 隱藏軟鍵盤(功能鍵)
         */
        getWindow().getDecorView().setSystemUiVisibility(

                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


下面的是轉載的我沒有實現 可能是文件我沒看到太好 官網那幾個方法我沒有看的太細

轉載出  http://www.jcodecraeer.com/a/anzhuokaifa/developer/2014/1117/1997.html

“雖然在android4.0之後就引入了虛擬鍵,但是google真正解決虛擬鍵所帶來的困擾是在4.4版本之後。這篇文章就是教你如何徹底解決虛擬鍵帶來的問題。在前面的幾篇文章中我們已經知道如何同時隱藏狀態列和導航欄,按理說已經全屏了 ,但是前面的的這些方法都有個缺點,在全屏的時候使用者不能有任何的互動行為,否則全屏效果將消失。(google這樣設計的目的是為了讓虛擬鍵能繼續發揮它的作用,總要在全屏之後找個時機讓虛擬鍵出來吧,但是這種時機其實不能滿足絕大多數需求,這種設計是有問題的,因為顯然我們有在全屏模式下也能互動的需求。)”

-譯者注

在android4.4及以上版本中為setSystemUiVisibility()方法引入了一個新的flag:SYSTEM_UI_FLAG_IMMERSIVE,它可以使你的app實現真正意義上的全屏體驗。當SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_HIDE_NAVIGATION 和SYSTEM_UI_FLAG_FULLSCREEN三個flag一起使用的時候,可以隱藏狀態列與導航欄,同時讓你的app可以捕捉到使用者的所有觸控式螢幕事件。

當沉浸式全屏模式啟用的時候,你的activity會繼續接受各類的觸控事件。使用者可以通過在狀態列與導航欄原來區域的邊緣向內滑動讓系統欄重新顯示。這個操作清空了SYSTEM_UI_FLAG_HIDE_NAVIGATION(和SYSTEM_UI_FLAG_FULLSCREEN,如果有的話)兩個標誌,因此係統欄重新變得可見。如果設定了的話,這個操作同時也觸發了View.OnSystemUiVisibilityChangeListener。然而, 如果你想讓系統欄在一段時間後自動隱藏的話,你應該使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY標籤。請注意,'sticky'版本的標籤不會觸發任何的監聽器,因為在這個模式下展示的系統欄是處於暫時的狀態。

圖1展示了各種不同的“沉浸式”狀態

在上圖中:

  1. 非沉浸模式 —— 展示了應用進入沉浸模式之前的狀態。也展示了設定IMMERSIVE標籤後用戶滑動展示系統欄的狀態。使用者滑動後,SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN就會被清除,系統欄就會重新顯示並保持可見。請注意,最好的方式就是讓所有的UI控制元件與系統欄的顯示隱藏保持同步,這樣可以減少螢幕顯示所處的狀態,同時提供了更無縫平滑的使用者體驗。因此所有的UI控制元件跟隨系統欄一同顯示。一旦應用進入了沉浸模式,UI控制元件也跟隨著系統欄一同隱藏。為了確保UI的可見性與系統欄保持一致,我們需要一個監聽器View.OnSystemUiVisibilityChangeListener來監聽系統欄的變化。這在下一節中將詳細講解。

  2. 提示氣泡——第一次進入沉浸模式時,系統將會顯示一個提示氣泡,提示使用者如何再讓系統欄顯示出來。請注意,如果為了測試你想強制顯示提示氣泡,你可以先將應用設為沉浸模式,然後按下電源鍵進入鎖屏模式,並在5秒中之後開啟螢幕。

  3. 沉浸模式—— 這張圖展示了隱藏了系統欄和其他UI控制元件的狀態。你可以設定IMMERSIVEIMMERSIVE_STICKY來進入這個狀態。

  4. 粘性標籤——這就是你設定了IMMERSIVE_STICKY標籤時的UI狀態,使用者會向內滑動以展示系統欄。半透明的系統欄會臨時的進行顯示,一段時間後自動隱藏。滑動的操作並不會清空任何標籤,也不會觸發系統UI可見性的監聽器,因為暫時顯示的導航欄並不被認為是一種可見的狀態。

注意,immersive類的標籤只有在與SYSTEM_UI_FLAG_HIDE_NAVIGATION,SYSTEM_UI_FLAG_FULLSCREEN中一個或兩個一起使用的時候才會生效。你可以只使用其中的一個,但是一般情況下你需要同時隱藏狀態列和導航欄以達到沉浸的效果。

如何確定使用哪種沉浸模式

SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_IMMERSIVE_STICKY都提供了沉浸式的體驗,但是在上面的描述中,他們是不一樣的,下面講解一下什麼時候該用哪一種標籤。

  • 如果你在寫一款圖書瀏覽器、新聞雜誌閱讀器,請將IMMERSIVE標籤與SYSTEM_UI_FLAG_FULLSCREEN,SYSTEM_UI_FLAG_HIDE_NAVIGATION一起使用。因為使用者可能會經常訪問Action Bar和一些UI控制元件,又不希望在翻頁的時候有其他的東西進行干擾。IMMERSIVE在該種情況下就是個很好的選擇。

  • 如果你在打造一款真正的沉浸式應用,而且你希望螢幕邊緣的區域也可以與使用者進行互動,並且他們也不會經常訪問系統UI。這個時候就要將IMMERSIVE_STICKYSYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION兩個標籤一起使用。比如做一款遊戲或者繪圖應用就很合適。

  • 如果你在打造一款視訊播放器,並且需要少量的使用者互動操作。你可能就需要之前版本的一些方法了(從Android 4.0開始)。對於這種應用,簡單的使用SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION就足夠了,不需要使用immersive標籤。

使用非STICKY的沉浸模式

當你使用SYSTEM_UI_FLAG_IMMERSIVE標籤的時候,它是基於其他設定過的標籤(SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN)來隱藏系統欄的。當用戶向內滑動,系統欄重新顯示並保持可見。

用其他的UI標籤(如SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONSYSTEM_UI_FLAG_LAYOUT_STABLE)來防止系統欄隱藏時內容區域大小發生變化是一種很不錯的方法。你也需要確保Action Bar和其他系統UI控制元件同時進行隱藏。下面這段程式碼展示瞭如何在不改變內容區域大小的情況下,隱藏與顯示狀態列和導航欄。

// This snippet hides the system bars.
private void hideSystemUI() {
    // Set the IMMERSIVE flag.
    // Set the content to appear under the system bars so that the content
    // doesn't resize when the system bars hide and show.
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
            | View.SYSTEM_UI_FLAG_IMMERSIVE);
}
// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}


你可能同時也希望在如下的幾種情況下使用IMMERSIVE標籤來提供更好的使用者體驗:

  • 註冊一個監聽器來監聽系統UI的變化。

  • 實現onWindowFocusChanged()函式。如果視窗獲取了焦點,你可能需要對系統欄進行隱藏。如果視窗失去了焦點,比如說彈出了一個對話方塊或選單,你可能需要取消那些將要在Handler.postDelayed()或其他地方的隱藏操作。

  • 實現一個GestureDetector,它監聽了onSingleTapUp(MotionEvent)事件。可以使使用者點選內容區域來切換系統欄的顯示狀態。單純的點選監聽可能不是最好的解決方案,因為當用戶在螢幕上拖動手指的時候(假設點選的內容佔據了整個螢幕),這個事件也會被觸發。

使用STICKY的沉浸模式

當使用了SYSTEM_UI_FLAG_IMMERSIVE_STICKY標籤的時候,向內滑動的操作會讓系統欄臨時顯示,並處於半透明的狀態。此時沒有標籤會被清除,系統UI可見性監聽器也不會被觸發。如果使用者沒有進行操作,系統欄會在一段時間內自動隱藏。

圖2展示了當使用IMMERSIVE_STICKY標籤時,半透明的系統欄展示與又隱藏的狀態。

下面是一段實現程式碼。一旦視窗獲取了焦點,只要簡單的設定IMMERSIVE_STICKY與上面討論過的其他標籤即可。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}
}


注意,如果你想實現IMMERSIVE_STICKY的自動隱藏效果,同時也需要展示你自己的UI控制元件。你只需要使用IMMERSIVEHandler.postDelayed()或其他類似的東西,讓它幾秒後重新進入沉浸模式即可。