沉浸式笔记

1.如何让状态栏渐隐?

该方法仅支持4.0及以上的版本,使用该方法不会导致页面resize,但是系统栏的图标会渐隐。当用户点击status bar或navigation bar区域时,它们会重新显示。   

1.1 状态栏渐隐

View decorView=getWindow().getDecorView();
//这个标识,可以让状态栏和导航栏文字渐隐
int uiOption=View.SYSTEM_UI_FLAG_LOW_PROFILE;
decorView.setSystemUiVisibility(uiOption);

设置之后,当用户点击状态栏或者导航栏,会导致这个标识被消除,图标会重新显示出来。如果想再次隐藏,需要重置标识

1.2 重置标识

View decorView = getActivity().getWindow().getDecorView();
//setSystemUiVisibility设置为0,可以清除所有标识
decorView.setSystemUiVisibility(0);

2. 隐藏状态栏

隐藏状态栏可以让内容区域占用更大的区域,为用户提供一种沉浸式体验。

2.1 隐藏状态栏-兼容4.0及以下

在4.0及以下版本中隐藏Statusbar,可以通过代码设置WindowManager的flags,也可以在manifest.xml中设置activity的theme来达到此效果。   

如果想让Statusbar一直处于隐藏状态,可以直接设置application的theme。
<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

通过设置Activity的theme来达到隐藏效果的优势:

1. 比通过代码设置更容易保持,减少异常。
2. 会让UI有一个更加平滑的过渡,因为在渲染之前,系统就已经获取到了要渲染的信息。


当然,也可以通过代码设置WindowManager的flag。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //版本小于16,调用这个方法隐藏status bar
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}


当设置了flag之后,这个flag会一直存在,除非主动去清除掉。可以调用 FLAG_LAYOUT_IN_SCREEN来清除flag。该标记可以防止status bar显示或隐藏时页面resize   

2.2 隐藏状态栏-4.0以上

4.0及以上版本可以通过setSysytemUIVisibility()方法,该方法会把View等级汇聚到window层级,这种方法比设置windowManager的flag更加精准

View decorView = getWindow().getDecorView();
// 隐藏Statusbar
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// 隐藏Action bar
ActionBar actionBar = getActionBar();
actionBar.hide();

注意:
1. 当Navigation bar隐藏的时候,UI flag会被立即清除,如果想要再次隐藏,需要重置标识。
2. 在何处设置标识?如果在onCreate()中设置标识,隐藏系统栏。当用户按下Home键,系统栏就会重新显示出来。当用户重新打开Activity,因为onCreate()方法不会重新执行,这就会导致系统栏仍然显示着。如果想要保持改变,可以在onResume()或onWindowFocusChange()方法中设置  
3. setSystemUIVisibility()方法,只对Visible的View起作用。
4. 系统栏隐藏会导致setSystemUIVisibility()设置的flag被清除。  


在4.1及更高的版本中,可以设置内容区域显示在status bar后边,这样,每次statusbar 显示或隐藏的时候就不会导致页面resize。在使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN的时候,也可以使用 SYSTEM_UI_FLAG_LAYOUT_STABLE让布局保持稳定。  

3. 隐藏导航栏

隐藏导航栏的目的,也是为了让内容区域占有更大的空间,具体可以通过设置 SYSTEM_UI_FLAG_HIDE_NAVIGATION 标识来实现。

View decorView = getWindow().getDecorView();
//SYSTEM_UI_FLAG_FULLSCREEN只对4.1及以上有效
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);  

该方法的注意事项和隐藏标题栏的一样。 

4. 沉浸式全屏模式

4.4版本为setSystemUIVisibility()新增了 SYSTEM_UI_FLAG_IMMERSIVE标识,这个标识可以实现真正的全屏。该标识配合着SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN ,就可以同时隐藏状态栏和导航栏。并且可以让app捕获到所有的触摸事件。  

沉浸式模式可用的时候,activity仍然可以接受到所有的触摸事件,可以通过拖动status bar正常显示的区域,清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 和SYSTEM_UI_FLAG_FULLSCREEN 标识,让系统栏重新显示。同时这个操作也会触发 View.OnSystemUiVisibilityChangeListener,如果想让系统栏重新自动隐藏,可以使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY标识

4.1 隐藏状态栏和导航栏

mHideStatusBar=true;
            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);

这里使用SYSTEM_UI_FLAG_IMMERSIVE标识,系统栏在隐藏之后会清除掉所有标识,想要重新隐藏,需要重置标识。

使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY标识,系统栏在显示后,隔段时间会自动隐藏。

4.2 显示状态栏和导航栏

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);

4.3 监听系统栏变化

为view注册View.OnSystemUiVisibilityChangeListener 监听

View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        //只有当没有设置LOW_PROFILE,HIDE_NAVIGATION, or //FULLSCREEN这些标识的时候,系统栏才会显示
        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
            //系统栏显示,可以在这里适配UI,比如显示action bar等等
        } else {
            //系统栏隐藏
        }
    }
});



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值