實現仿微信查看大圖的時候StatusBar和NavigationBar的狀態變化
兩篇不錯的關于這兩個Bar狀態的文章:
1.http://angeldevil.me/2014/09/02/About-Status-Bar-and-Navigation-Bar/
2.http://vitiy.info/small-guide-how-to-support-immersive-mode-under-android-4-4/
3.http://developer.android.com/training/system-ui/immersive.html
//得到contentView的父布局,是一個FrameLayout
rootContent = (ViewGroup) findViewById(android.R.id.content);
//add 大圖控件到 rootContent
root.addView(bview);
System UI的顯示和隱藏通過下面兩個函數實現。在hideSystemUI()
方法中,通過SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
和SYSTEM_UI_FLAG_FULLSCREEN
來隱藏Status Bar,讓Activity的UI占滿全屏(不會占據Navigation Bar的空間),通過SYSTEM_UI_FLAG_IMMERSIVE_STICKY
模式,使得系統以半透明方法顯示System UI方便用戶操作,并會在一段時間后自動隱藏,此時并不會引起onSystemUiVibilityChanged
的調用.
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void hideSystemUI() {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
在showSystemUI()
方法中,通過SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
使得Activity的UI占據全屏,但是這個時候Status Bar和Navigation Bar都沒有被隱藏,所以Status Bar會遮擋住Activity UI的部分空間。解決辦法就是給ContentView設置fitSystemWindows
為true。這樣系統會把被Status Bar遮擋住的區域自動轉化成Activity UI的內邊距,這樣被StatusBar遮擋的問題就得到了解決。
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void showSystemUI() {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
但是當Window的焦點發生變化的時候,SYSTEM_UI_FLAG_IMMERSIVE_STICKY
就會失效,Status Bar會重新出現,并且不是透明的??梢员O聽onWindowFocusChanged
事件來重新調用hideSystemUI()
方法。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && hasView) {
mPhotoView.postDelayed(new Runnable() {
@Override
public void run() {
hideSystemUI();
}
}, 500);
}
}
