实现仿微信查看大图的时候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会重新出现,并且不是透明的。可以监听onWindowFocusChanged
事件来重新调用hideSystemUI()
方法。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && hasView) {
mPhotoView.postDelayed(new Runnable() {
@Override
public void run() {
hideSystemUI();
}
}, 500);
}
}