Android 实现沉浸式体验

一、实现沉浸式状态栏

1、实现Activity沉浸式体验

1)先封装实现一个专门设置沉浸式的类

public class ImmersiveModeUtils {
    public static void setImmersiveMode(final View contentView){
        if (Build.VERSION.SDK_INT >= 19) {
            //先调用一次,设置沉浸
            contentView.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);
            contentView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
            {
                //状态栏可见性变化时候,会回调
                public void onSystemUiVisibilityChange(int visibility)
                {
                    contentView.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);
                }
            });
        }

    }
}

2)在基类BaseActivity的onCreate方法中调用一下以下代码即可,其他Activity继承于BaseActivity

 //设置沉浸式
ImmersiveModeUtils.setImmersiveMode(getWindow().getDecorView());

经过上述两步,正常来说已经实现了沉浸式状态栏效果了,但是在显示Dialog或者PupoWindow时候,状态栏/导航栏还是会显示出来,这显然没有满足我们沉浸式体验的需求

2、实现Dialog沉浸式体验

1)dialog要实现沉浸式,需要在show之前,先让dialog不要获取焦点,在show之后,再给dialog所在的window设置沉浸式代码,并恢复焦点

 @Override
    public void show() {
        //先让对话框失去焦点,这样才不会在对话框弹出来时候,沉浸式效果被破坏,导致导航栏显示出来
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        super.show();
        //显示之后,给dialog所在的window设置沉浸式,并重新获取焦点
        ImmersiveModeUtils.setImmersiveMode(getWindow().getDecorView());
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    }

3、实现PopuWindow沉浸式体验

1)在popuwindow显示之前,先设置不获取焦点(popuwindow不获取焦点时候,是可以点击被它所遮挡的控件的)
有两种方式可以设置,一种是创建时候设置:

 PopupWindow(View contentView, int width, int height, boolean focusable)

另一种是创建好PopupWindow对象之后,调用 mPopupWindow.setFocusable(false);设置

2)然后在popuwindow show之后再重新设置可以获取焦点,记得不要忘记调用update来更新,否则修改不生效

 //等popuwindow显示出来再设置获取焦点,避免显示那会弹出导航栏
mPopupWindow.setFocusable(true);
mPopupWindow.update();

3)接着对popuwindow也设置沉浸式体验

 //设置才不会在弹出来时候显示虚拟状态栏/导航栏
ImmersiveModeUtils.setImmersiveMode(mPopupWindow.getContentView());

完成上述3步,popuwindow也完美支持沉浸式状态栏效果

你可能感兴趣的:(android)