美文网首页
Android 全屏配置

Android 全屏配置

作者: 逃离_102 | 来源:发表于2022-07-22 21:54 被阅读0次

说明

全屏,在Android开发中,是很常见的操作。很多时候都需要全屏后,再进行自定义布局。下面就总结一下相关的几个方法。

具体方法示例如下

public class ScreenUtils {
    /**
     * activity全屏切换
     **/
    public static void changeFullScreen(Activity activity, boolean isFullscreen) {
        if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
            return;
        }
        View decorView = activity.getWindow().getDecorView();
        int flag = decorView.getSystemUiVisibility();
        if (isFullscreen) {
            // 状态栏隐藏
            flag |= View.SYSTEM_UI_FLAG_FULLSCREEN;
            // 导航栏隐藏
            flag |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            // 布局延伸到导航栏
            flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
            // 布局延伸到状态栏
            flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            // 全屏时,增加沉浸式体验
            flag |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            //  部分国产机型适用.不加会导致退出全屏时布局被状态栏遮挡
            // activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            // android P 以下的刘海屏,各厂商都有自己的适配方式,具体在manifest.xml中可以看到
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                WindowManager.LayoutParams pa = activity.getWindow().getAttributes();
                pa.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                activity.getWindow().setAttributes(pa);
            }
        } else {
            flag &= ~View.SYSTEM_UI_FLAG_FULLSCREEN;
            flag &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            flag &= ~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            flag &= ~View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
            //            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                WindowManager.LayoutParams pa = activity.getWindow().getAttributes();
                pa.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
                activity.getWindow().setAttributes(pa);
            }
        }
        decorView.setSystemUiVisibility(flag);
    }

    /**
     * dialog全屏切换
     **/
    public void changeFullScreen(Dialog dialog, boolean isFullscreen) {
        if (dialog == null) {
            return;
        }
        Window window = dialog.getWindow();
        if (window == null) {
            return;
        }
        View decorView = window.getDecorView();
        int flag = decorView.getSystemUiVisibility();
        if (isFullscreen) {
            // 状态栏隐藏
            flag |= View.SYSTEM_UI_FLAG_FULLSCREEN;
            // 导航栏隐藏
            flag |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            // 布局延伸到导航栏
            flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
            // 布局延伸到状态栏
            flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            // 全屏时,增加沉浸式体验
            flag |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            // 部分国产机型适用.不加会导致退出全屏时布局被状态栏遮挡,注意加这个会导致OnGlobalLayoutListener返回的数据为10000.
            window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            // android P 以下的刘海屏,各厂商都有自己的适配方式,具体在manifest.xml中可以看到
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                WindowManager.LayoutParams pa = window.getAttributes();
                pa.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                window.setAttributes(pa);
            }
        } else {
            flag &= ~View.SYSTEM_UI_FLAG_FULLSCREEN;
            flag &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            flag &= ~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            flag &= ~View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
            window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                WindowManager.LayoutParams pa = window.getAttributes();
                pa.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
                window.setAttributes(pa);
            }
        }
        decorView.setSystemUiVisibility(flag);
    }
}

总结

titlebar还需在主题,或者代码中设置为no titlebar;另外这记录的全屏方法在Android 11后被标记为过时,后面再写文章总结。还有Android版本不同,有些不一样,同样得再总结。

就说到这了,有什么不对的地方,欢迎指正,有什么没说全的,欢迎讨论留言

相关文章

网友评论

      本文标题:Android 全屏配置

      本文链接:https://www.haomeiwen.com/subject/leydirtx.html