什么是沉浸式婴梧?
根據(jù)百度百科上的定義,沉浸式就是要給用戶提供完全沉浸的體驗(yàn)辨绊,使用戶有一種置身于虛擬世界之中的感覺奶栖。
一些橫屏的游戲啊,和一些播放器頁面门坷,通常都會(huì)用到宣鄙,讓用戶不被其他事物所干擾,沉浸其中默蚌,這可能就是目的價(jià)值所在吧冻晤;
下面讓我們一步一步,從最普通的界面绸吸,走進(jìn)沉浸式鼻弧;
1,新寫了個(gè)頁面设江,里面只有一個(gè)imageView控件,設(shè)置充滿攘轩。最普通的界面叉存,認(rèn)識(shí)一下界面的組成。
可以看到度帮,沉浸式是要去掉這些導(dǎo)航欄鹉胖,狀態(tài)欄,ActionBar够傍。只顯示主題內(nèi)容甫菠。
2,首先我們隱藏狀態(tài)欄和標(biāo)題欄。
<!-- 第一種冕屯,只支持4.1以上的系統(tǒng)寂诱,去掉action bar 和狀態(tài)欄 (無任何操作效果)-->
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getWindow().getDecorView()方法獲取到了當(dāng)前界面的DecorView
View decorView = getWindow().getDecorView();
然后調(diào)用它的setSystemUiVisibility()方法來設(shè)置系統(tǒng)UI元素的可見性。其中安聘,SYSTEM_UI_FLAG_FULLSCREEN表示全屏的意思痰洒,也就是會(huì)將狀態(tài)欄隱藏。
int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
//另外浴韭,根據(jù)Android的設(shè)計(jì)建議丘喻,ActionBar是不應(yīng)該獨(dú)立于狀態(tài)欄而單獨(dú)顯示的,因此狀態(tài)欄如果隱藏了念颈,我們同時(shí)也需要調(diào)用ActionBar的hide()方法將ActionBar也進(jìn)行隱藏泉粉。
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
}
重新運(yùn)行之后;
當(dāng)然榴芳,這也不是我們想要的嗡靡。
3,透明的狀態(tài)欄。
首先需要注意窟感,這樣的效果是只有5.0及以上系統(tǒng)才支持讨彼,因此這里先進(jìn)行了一層if判斷,只有系統(tǒng)版本大于或等于5.0的時(shí)候才會(huì)執(zhí)行下面的代碼柿祈。
接下來我們使用了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE哈误,注意兩個(gè)Flag必須要結(jié)合在一起使用,表示會(huì)讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間躏嚎,最后再調(diào)用Window的setStatusBarColor()方法將狀態(tài)欄設(shè)置成透明色就可以了蜜自。
//第二種 UI Flag 透明背景的狀態(tài)欄
if (Build.VERSION.SDK_INT >= 21) {
//效果是只有5.0及以上系統(tǒng)才支持
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
看一下效果:
狀態(tài)欄透明了對(duì)吧,但是我的圖片背景是淺色的紧索,狀態(tài)欄里的圖標(biāo)顏色是白色的袁辈,并不顯眼菜谣,看起來不明確怎么辦珠漂?加兩行代碼晚缩,搞定,不過只支持6.0以上
//只支持6.0以上的系統(tǒng)媳危;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
或者在style屬性中:
<item name="android:windowLightStatusBar">true</item>
國內(nèi)三方Android系統(tǒng)都有深色狀態(tài)欄字體模式荞彼,但是目前只看到了小米和魅族公開了各自的實(shí)現(xiàn)方法,支持底層Android4.4以上的版本待笑。而Android官方在6.0版本才有了深色狀態(tài)欄字體API鸣皂。
效果
4,好的,看完?duì)顟B(tài)欄暮蹂,我們看一下底部這個(gè)導(dǎo)航欄寞缝,首先隱藏導(dǎo)航欄。
其實(shí)實(shí)現(xiàn)的原理都是一樣的仰泻,隱藏導(dǎo)航欄也就是使用了不同的UI Flag而已荆陆,修改MainActivity中的代碼,如下所示:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
這里我們同時(shí)使用了SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN集侯,這樣就可以將狀態(tài)欄和導(dǎo)航欄同時(shí)隱藏了”惶洌現(xiàn)在重新運(yùn)行一下程序,效果如圖所示棠枉。
但是呢浓体,這次看上去好像終于是完全全屏化了,但其實(shí)上這離真正的沉浸式模式還差得比較遠(yuǎn)辈讶,因?yàn)樵谶@種模式下命浴,我們觸摸屏幕的任意位置都會(huì)退出全屏。
我們也可以把狀態(tài)欄和導(dǎo)航欄都設(shè)成透明色贱除,如下所示:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
這里使用了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION咳促,表示會(huì)讓應(yīng)用的主體內(nèi)容占用系統(tǒng)導(dǎo)航欄的空間,然后又調(diào)用了setNavigationBarColor()方法將導(dǎo)航欄設(shè)置成透明色】彼牛現(xiàn)在重新運(yùn)行一下程序跪腹,效果如下圖所示。
5,真正的沉浸式飞醉。
首先你應(yīng)該確定自己是否真的需要這個(gè)功能冲茸,因?yàn)槌讼裼螒蚧蛘咭曨l軟件這類特殊的應(yīng)用,大多數(shù)的應(yīng)用程序都是用不到沉浸式模式的缅帘。
當(dāng)你確定要使用沉浸式模式轴术,那么只需要重寫Activity的onWindowFocusChanged()方法,然后加入如下邏輯即可:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
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);
}
}
}
沉浸式模式的UI Flag就這些钦无,也沒什么好解釋的逗栽,如果你需要實(shí)現(xiàn)沉浸式模式,直接將上面的代碼復(fù)制過去就行了失暂。需要注意的是彼宠,只有在Android 4.4及以上系統(tǒng)才支持沉浸式模式鳄虱,因此這里也是加入了if判斷。
另外凭峡,為了讓我們的界面看上去更像是游戲拙已,這里我將MainActivity設(shè)置成了橫屏模式:
<activity android:name=".MainActivity" android:screenOrientation="landscape">
...
</activity>
可以看到,界面默認(rèn)情況下是全屏的摧冀,狀態(tài)欄和導(dǎo)航欄都不會(huì)顯示倍踪。而當(dāng)我們需要用到狀態(tài)欄或?qū)Ш綑跁r(shí),只需要在屏幕頂部向下拉索昂,或者在屏幕右側(cè)向左拉建车,狀態(tài)欄和導(dǎo)航欄就會(huì)顯示出來,此時(shí)界面上任何元素的顯示或大小都不會(huì)受影響椒惨。過一段時(shí)間后如果沒有任何操作癞志,狀態(tài)欄和導(dǎo)航欄又會(huì)自動(dòng)隱藏起來,重新回到全屏狀態(tài)框产。
這就是最標(biāo)準(zhǔn)的沉浸式模式
貼一下代碼:
<a>https://github.com/WKaKa/Feed/tree/master/Immerse</a>