亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

沉浸式模式

2019-11-06 09:42:36
字體:
來源:轉載
供稿:網友

第一次在項目中要用到全屏功能的時候無從下手,然后就是去百度了。百度到的結果都是差不多的。不過直接把代碼貼過來的確是可以用的。但是除了知道怎么做之外還想去理解它,因為只有理解了才能舉一反三嘛。好在在后來的時候看到了官方的文檔,寫的非常詳細。

–> 我是官方文檔 <–

接下來開始正題

… … …

先給出一些名詞方便下面的講解

StatusBar StatusBar

NavigationBar NavigationBar

SystemBar – StatusBar 跟 NavigationBar 的統稱


設置全屏主要分為兩種方式:

4.0 之前采用的方式4.0 之后新增的方式

4.0 以及之前設置全屏

因為 4.0 之前的系統已經很少了,所以這里就簡單的說一下。 有兩種方式可以實現全屏:

使用全屏的主題getWindow().addFlag(WindowManager.LayoutParams.FLAG_FULLSCREEN);

這種全屏方式是無法隱藏 NavigationBar 的(如果有 NavigationBar 的話),因為 NavigationBar 是在 4.0 以后才引入的。使用這種方式設置全屏的特點是,離開了 App 后再進入 App 時,依然處于全屏模式,只能清除掉全屏標志位才能退出全屏。


4.1 以及之后設置全屏

4.1 以及之后使用 View 的 setSystemUiVisibility() 來對 SystemBar 進行控制。 任何 View 都可以用來調用這個方法,只要它是可見狀態的。

下面先把要涉及到的 flag 分組列舉出來(所有的 flag 都是以 SYSTEM_UI_FLAG 作為前綴,所以下面將其省略)。

控制 SystemBar 相關:

FULLSCREENHIDE_NAVIGATIONLOW_PROFILE

布局相關:

LAYOUT_SCREENLAYOUT_HIDE_NAVIGATIONLAYOUT_STABLE

沉浸式相關 (4.4 引入):

IMMERSIVEIMMERSIVE_STICKY

超前提示:

在離開 App 時,比如按了 home / 多任務鍵 會導致設置的控制 SystemBar 相關的 flag 被清除,而其他設置的 flag 不會受到影響。

FULLSCREEN

雖然寫的是 Fullscreen ,但其實只是隱藏 StatusBar。

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mDecorView = getWindow().getDecorView();    mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);    // Google 建議隱藏 StatusBar 時也將 ActionBar 一起隱藏    getActionBar().hide();}1234567891012345678910

這里寫圖片描述

看圖可以得出以下幾點:

點擊屏幕 StatusBar 不會顯示出來從屏幕上邊緣往下滑可以讓 StatusBar 重新顯示點擊 home / 多任務鍵再返回 App 時 StatusBar 重新顯示了出來,印證了超前提示里所說的。而且 StatusBar 在顯示出來以后不會自動隱藏,這一點跟在 4.1 之前設置的全屏方式不一樣,因為設置的 FULLSCREEN flag 已經被清除了,如果想重新隱藏,需要重新設置該 flag。StatusBar 的顯示 / 隱藏會使 ImageView 大小發生了變化

為了防止布局大小不會因為 StatusBar 的顯示 / 隱藏發生變化,有兩種 flag 可供選擇:

1.LAYOUT_STABLE

mDecorView.setSystemUiVisibility(        View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);123123

這里有一點需要注意:設置多個標志位時要用 | 連接起來,不能多次調用 setSystemUiVisibility。如:

mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);1212

這樣的結果就是只有最后一次設置的 flag 生效,而之前設置的標志位會被清除。也就是說上面的代碼中只設置了 LAYOUT_STABLE 而 FULLSCREEN 被清除了。所以如果想清除之前設置的所有 flag ,mDecorView.setSystemUiVisibility(0) 就可以了

這次布局并沒有延伸到 StatusBar 底下,所以大小也就不會受到它的影響

2.LAYOUT_FULLSCREEN

mDecorView.setSystemUiVisibility(        View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);123123

可以看到布局已經延伸到了 StatusBar 底部。

HIDE_NAVIGATION

protected void onCreate(Bundle savedInstanceState) {    mDecorView.setSystemUiVisibility(        View.SYSTEM_UI_FLAG_FULLSCREEN            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);}1234512345

Google 建議隱藏 NavigationBar 的同時將 StatusBar 一起隱藏。

與隱藏 StatusBar 時不同的是,隱藏了 NavigationBar 以后,點擊屏幕的任何位置都會導致設置的所有控制 SystemBar 相關的 flag 被清除,所以 SystemBar 重新顯示了出來。這里還需要注意的在這種模式下點擊屏幕點擊事件會被屏蔽,要等到 SystemBar 顯示出來以后再次點擊,事件才會傳遞到我們的布局中。

與 LAYOUT_FULLSCREEN 類似的是, LAYOUT_HIDE_NAVIGATION 可以讓布局內容延伸到 NavigationBar 的底部。

因為離開 App 后控制 SystemBar 相關的 flag 會被清除,所以可以按需在 onResume() 或者 onWindowFocusChanged() 中重新設置它們。

LOW_PROFILE

protected void onCreate(Bundle savedInstance) {    mDecorView.setSystemUiVisibility(                View.SYSTEM_UI_FLAG_LOW_PROFILE);}12341234

作用是減少 StatusBar 中的圖標并使其變暗,將 NavigationBar 中的按鈕減弱成 3 個點。 知乎在閱讀文章的時候就使用到了這個模式

這里寫圖片描述

可以看到,在向上滑動內容的時候 SystemBar 的內容被弱化了,這樣可以減少其他元素對閱讀者的干擾。

設置沉浸式模式(4.4 之后引入)

沉浸式模式是在 4.4 之后才引入的


IMMERSIVE

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             | View.SYSTEM_UI_FLAG_FULLSCREEN            | View.SYSTEM_UI_FLAG_IMMERSIVE);12345671234567

可以看到設置了該 flag 以后,點擊屏幕不會讓 SystemBar 顯示出來。呼出 SystemBar 的方式是在屏幕上邊緣向下滑動,在呼出 SystemBar 后,控制 SystemBar 相關的 flag 會被清除。

IMMERSIVE_STICKY

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             | View.SYSTEM_UI_FLAG_FULLSCREEN            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);12345671234567

跟 IMMERSIVE 不同的是,在該模式下呼出的 SystemBar 會在短暫的顯示后重新隱藏。并且在 SystemBar 顯示出來的時候點擊屏幕中心會立刻讓 SystemBar 重新隱藏。所以在模式下呼出 SystemBar 并不會清除控制 SystemBar 相關的 flag。但是離開 App 時控制 SystemBar 相關的 flag 還是會被清除。

所以在回到 App 的時候需要重新設置:

@Overridepublic 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);}}123456789101112123456789101112

監聽 SystemBar 的變化

通常情況下我們需要能夠控制 SystemBar 的顯示與隱藏,這個時候就需要監聽 SystemBar 的狀態。 通過 OnSystemUiVisibilityChangeListener 就可以對 SystemBar 的狀態進行監聽。

protected void onCreate(Bundle savedInstance) {    mDecorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {        @Override        public void onSystemUiVisibilityChange(int visibility) {            if (visibility == 0) {            // SystemBar 處于顯示狀態            } else {            // SystemBar 處于隱藏狀態            }        }});12345678910111234567891011

上面的代碼展示了如何對 SystemBar 的狀態進行監聽。 當 SystemBar 的顯示狀態發生變化時,onSystemUiVisibilityChange() 方法就會被調用。但是有一個例外,設置 IMMERSIVE_STICKY 后將 SystemBar 呼出并不會觸發該監聽器。

下面具體解釋一下 onSystemUiVisibilityChange(int visibility) 方法

onSystemUiVisibilityChange(int visibility) 方法中的 visibility 參數表示的是 LOW_PROFILE、FULLSCREEN 跟HIDE_NAVIGATION 這三個 flag 的值的和。

FULLSCREEN(4)HIDE_NAVIGATION(2)LOW_PROFILE(1)

括號中的數字是它們的值。

為什么 visibility 只是表示這 3 個 flag 的和呢?因為只有這 3 個值是跟控制 SystemBar 相關的。也就是說從visibility 的值就可以只知道我們設置了哪些 flag。比如當 visibility 等于 4 時,說明設置了 FULLSCREEN 這個 flag;如果 visibility 等于 7 則說明 3 種 flag 都設置了。所以當 visibility 為 0 時表示沒有設置任何控制 SystemBar 的 flag,也就說明了 SystemBar 當前處于顯示狀態。

那為什么 visibility 的值會是它們三個的和呢?因為我們在設置 flag 的時候是用 | 將多個 flag 連接在一起的, | 就相當于把它們的值加起來。

下面給出一個 Demo ,功能是點擊圖片時進入 / 退出全屏

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @BindView(R.id.image)    ImageView mImage;    View mDecorView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        mDecorView = getWindow().getDecorView();        // 讓圖片鋪滿屏幕        mDecorView.setSystemUiVisibility(                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);    }    @OnClick(R.id.image)    public void onClick() {        // 只需要處理隱藏 SystemBar 就行了,因為顯示 SystemBar 是由系統完成的        hideSystemUI();    }    private void hideSystemUI() {        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                        | View.SYSTEM_UI_FLAG_FULLSCREEN);    }    private void showSystemUI() {        mDecorView.setSystemUiVisibility(                View.SYSTEM_UI_FLAG_LAYOUT_STABLE                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);    }}12345678910111213141516171819202122232425262728293031323334353637383940414243441234567891011121314151617181920212223242526272829303132333435363738394041424344

這里有一個問題,如果點擊稍微快一點的話就會出現只隱藏 StatusBar 而沒有隱藏 NavigationBar 的情況。如果有哪個小伙伴知道的話請告知一下。

希望這篇文章能給大家帶來一點點幫助。

頂8
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久久久ntr影视| 亚洲第一页中文字幕| 91精品视频专区| 亚洲aⅴ日韩av电影在线观看| 国产精品aaa| 久久中文字幕在线| 精品亚洲一区二区三区| 亚洲国产精品系列| 国产日韩中文在线| 亚洲精品网站在线播放gif| 成人国产精品久久久久久亚洲| 亚洲第一网中文字幕| 成人精品视频在线| 国产精品成人aaaaa网站| 国产日产久久高清欧美一区| 亚洲精品永久免费精品| 成人黄色大片在线免费观看| 91av中文字幕| 欧美国产日韩一区二区| 色多多国产成人永久免费网站| 国产精品老女人精品视频| 亚洲综合最新在线| 欧美视频一二三| 久久久久久久影视| 亚洲第一福利网| 高清欧美性猛交| 国产精品黄页免费高清在线观看| 欧美一级淫片videoshd| 日韩精品视频在线观看网址| 国产精品视频成人| 亚洲国产高清福利视频| 亚洲欧洲黄色网| 亚洲人永久免费| 日韩精品视频在线免费观看| 久久全球大尺度高清视频| 精品国产欧美成人夜夜嗨| 国产精品成人一区二区三区吃奶| 亚洲国产成人精品久久久国产成人一区| 色老头一区二区三区| 日韩二区三区在线| 久热国产精品视频| 日韩亚洲在线观看| 亚洲天堂免费视频| 成人网在线观看| 精品国产欧美一区二区五十路| 亚洲一区二区三区成人在线视频精品| 欧美午夜视频一区二区| 久久精品国产成人精品| 精品国产欧美一区二区五十路| 日韩电影在线观看永久视频免费网站| 国产啪精品视频网站| 亚洲国产精品资源| 欧美日韩国产999| 亚洲区中文字幕| 久久精品美女视频网站| 国产精品激情av在线播放| 国产午夜精品一区二区三区| 超碰精品一区二区三区乱码| 欧美极品美女电影一区| 久久的精品视频| 懂色aⅴ精品一区二区三区蜜月| 国产精品网站入口| 日韩欧美中文字幕在线观看| 日韩中文字幕国产| 欧美视频在线观看 亚洲欧| 日韩欧美在线视频免费观看| 91久久久久久久一区二区| 国产精品va在线播放我和闺蜜| 日本三级韩国三级久久| 国产精品视频自拍| 国产精品一区二区久久国产| 欧美性生活大片免费观看网址| 成人网址在线观看| 91深夜福利视频| 欧美一区二区色| 日韩在线播放一区| 亚洲欧美日韩直播| 亚洲欧美国产一本综合首页| 亚洲一区二区三区毛片| 97人洗澡人人免费公开视频碰碰碰| 日韩欧美亚洲一二三区| 国产+人+亚洲| 中文国产亚洲喷潮| 日韩国产激情在线| 国模吧一区二区三区| 欧美精品国产精品日韩精品| 欧美视频裸体精品| 91久久国产综合久久91精品网站| 亚州国产精品久久久| 中文日韩电影网站| 中文日韩在线视频| 亚洲国产高潮在线观看| 亚洲人a成www在线影院| 狠狠色噜噜狠狠狠狠97| 久久精品免费播放| 91沈先生在线观看| 国产一区二区三区精品久久久| 91av在线不卡| 国产精品亚洲美女av网站| 国产精品白丝av嫩草影院| 日韩成人激情在线| 成人羞羞国产免费| 中文字幕亚洲一区在线观看| 6080yy精品一区二区三区| 国产亚洲欧洲在线| 2019精品视频| 国产精品一区二区久久精品| 欧美日韩在线视频一区| 精品女同一区二区三区在线播放| 国产成人精品久久| 26uuu另类亚洲欧美日本一| 国产精品久久久久不卡| 午夜伦理精品一区| 亚洲а∨天堂久久精品9966| 国产精品入口免费视| 日本欧美国产在线| 51精品在线观看| 69av在线视频| 8x海外华人永久免费日韩内陆视频| 91欧美精品午夜性色福利在线| 久久免费国产精品1| 日韩视频免费观看| www.亚洲人.com| 国产精品久久一区| 色诱女教师一区二区三区| 国产伊人精品在线| 九九精品在线播放| 精品视频中文字幕| 欧美与黑人午夜性猛交久久久| 亚洲人永久免费| 亚洲片在线观看| 日韩成人在线免费观看| 国产精品三级久久久久久电影| 欧美影院成年免费版| 精品免费在线视频| 欧美激情在线观看视频| 久久九九热免费视频| 美女精品久久久| 国产成人精品免高潮费视频| 欧美理论电影在线播放| 尤物yw午夜国产精品视频明星| 亚洲va码欧洲m码| 国产在线播放不卡| 57pao精品| 国产欧美日韩视频| 亚洲视频在线播放| 精品久久久中文| 日韩av免费一区| 精品视频在线播放色网色视频| 亚洲最大在线视频| 韩剧1988免费观看全集| 国产主播精品在线| 精品久久久久久久久久久久久| 日韩av在线电影网| 国产成人精品一区二区三区| 91禁外国网站| 精品久久久国产精品999| 久久久久久网址| 全亚洲最色的网站在线观看| 国产精品久久久久免费a∨| 欧美精品激情blacked18| 亚洲网站视频福利| 日本欧美一二三区| 国产欧美日韩91|