沉浸式模式和透明狀態(tài)欄

沉浸式模式(Immersive Mode)這是Android官方給出的說法,坊間把這種模式稱為沉浸式狀態(tài)欄。

什么是沉浸式

以優(yōu)酷為例


真正的沉浸模式

在我們看電影或者打游戲時(shí)候,不會(huì)被系統(tǒng)界面元素如狀態(tài)欄,導(dǎo)航欄所打擾,才是沉浸模式的真正含義。
而類似于優(yōu)酷首頁(yè)這種


透明狀態(tài)欄

我們叫它透明狀態(tài)欄

沉浸模式

沉浸模式本質(zhì)上就是全屏化,需要隱藏掉系統(tǒng)和應(yīng)用程序的界面元素


系統(tǒng)和應(yīng)用程序的界面元素

沉浸模式和透明狀態(tài)欄是4.4提出的,這里不考慮4.4以下的兼容問題。

實(shí)現(xiàn)沉浸模式:

  • 隱藏ActionBar,狀態(tài)欄,導(dǎo)航欄
/**
 * 沉浸模式
 */
public class ImmersionActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_immersion);

        / //獲得DecorView
        View decorView=getWindow().getDecorView();
        //setSystemUiVisibility 設(shè)置系統(tǒng)UI元素的可見性
        //View.SYSTEM_UI_FLAG_FULLSCREEN 表示全屏,會(huì)將狀態(tài)欄隱藏,只會(huì)隱藏狀態(tài)欄
        //View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 隱藏導(dǎo)航
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        //隱藏ActivityBar
        ActionBar actionBar=getSupportActionBar();
        actionBar.hide();

    }
}

注釋已經(jīng)很清楚了,效果如下


去掉狀態(tài)欄,ActionBar,和導(dǎo)航欄的效果

但是當(dāng)我們點(diǎn)擊屏幕任意位置時(shí)j就會(huì)退出全屏模式,變成


點(diǎn)擊屏幕任意位置效果

這并不是我們想要的結(jié)果。

如何像優(yōu)酷視頻一樣當(dāng)我們橫屏下拉上邊框時(shí)才出現(xiàn)狀態(tài)欄和導(dǎo)航欄,這里需要重寫Activity的onWindowFocusChanged()并添加
相關(guān)Flag。
代碼如下:

/**
 * 沉浸模式
 */
public class ImmersionActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_immersion);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        //判斷4.4以上版本
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            //獲得DecorView
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE //來幫助你的app來維持一個(gè)穩(wěn)定的布局
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //確保appUI的主要部分不會(huì)因?yàn)楸幌到y(tǒng)導(dǎo)航欄覆蓋而結(jié)束
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //確保appUI的主要部分不會(huì)因?yàn)楸幌到y(tǒng)狀態(tài)欄覆蓋而結(jié)束
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隱藏導(dǎo)航欄
                            | View.SYSTEM_UI_FLAG_FULLSCREEN //表示全屏,會(huì)將狀態(tài)欄隱藏,只會(huì)隱藏狀態(tài)欄
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
        }
    }
}
  • 非粘性的沉浸式

使用Flag SYSTEM_UI_FLAG_IMMERSIVE,隱藏系統(tǒng)欄。當(dāng)用戶在系統(tǒng)欄區(qū)域向內(nèi)滑動(dòng)時(shí),系統(tǒng)欄會(huì)重新顯示并保持可見。

  • 粘性的沉浸式

當(dāng)使用Flag SYSTEM_UI_FLAG_IMMERSIVE_STICKY, 在系統(tǒng)欄的區(qū)域中向內(nèi)滑動(dòng)會(huì)引起系統(tǒng)欄出現(xiàn)一個(gè)半透明的狀態(tài),但是 flags 不會(huì)被清除,監(jiān)聽系統(tǒng)界面可見性變化的listeners并不會(huì)被調(diào)用。系統(tǒng)欄會(huì)再次動(dòng)態(tài)隱藏在幾秒之后,同樣當(dāng)用戶點(diǎn)擊了屏幕,系統(tǒng)欄也會(huì)隱藏。

效果

沉浸效果

需要注意的是 "immersive" 相關(guān)的Flags只有當(dāng)結(jié)合使用了 SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_UI_FLAG_FULLSCREEN 它們中的一個(gè)或者一起,才會(huì)起作用。

透明狀態(tài)欄

實(shí)現(xiàn)優(yōu)酷首頁(yè)透明狀態(tài)欄效果就很簡(jiǎn)單了

/**
 * 透明狀態(tài)欄
 */
public class LucencyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lucency);

        if (Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            // 此時(shí)使用 View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 時(shí)界面會(huì)和導(dǎo)航欄重疊 
            decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
//            getWindow().setNavigationBarColor(Color.TRANSPARENT);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();

    }
}

效果


優(yōu)酷首頁(yè)透明狀態(tài)欄效果

其他東西后續(xù)研究在此記錄:

DecorView是啥??
之后的DecorView研究

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容