IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android9.0刘海屏适配 -> 正文阅读

[移动开发]Android9.0刘海屏适配

沉浸式状态栏

  // 设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 设置沉浸式
        int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
        int uiVisibility = window.getDecorView().getSystemUiVisibility();
        uiVisibility |= flags;
        window.getDecorView().setSystemUiVisibility(uiVisibility);

刘海区黑边(内容区域下挫)问题

让内容区域延伸到刘海区

	WindowManager.LayoutParams params = window.getAttributes();
	/**
	 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
	 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容区域延伸到刘海区
	 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
	 */
	params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
	window.setAttributes(params); 

避开刘海区

// 避开刘海屏的两种方式
// 第一种: 设置布局第一个 View 的 topMargin 为状态栏的高度
// 第二种:设置布局跟View 的topPadding 为状态栏的高度

// 第一种
TextView topView = findViewById(R.id.top_view);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) topView.getLayoutParams();
layoutParams.topMargin = heightForDisplayCutout();
topView.setLayoutParams(layoutParams);
// 第二种
RelativeLayout containerView = findViewById(R.id.container);
containerView.setPadding(
        containerView.getPaddingLeft(),
        heightForDisplayCutout(),
        containerView.getPaddingRight(),
        containerView.getPaddingBottom());

适配刘海屏

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 1.设置全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 判断手机是否是刘海屏
        boolean hasDisplayCutout = hasDisplayCutout(window);
        if (hasDisplayCutout){
            // 2. 让内容区域延伸到刘海区
            WindowManager.LayoutParams params = window.getAttributes();
            /**
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容区域延伸到刘海区
             * LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
             */
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            window.setAttributes(params);

            // 3.设置沉浸式
            int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            int uiVisibility = window.getDecorView().getSystemUiVisibility();
            uiVisibility |= flags; // 追加沉浸式设置
            window.getDecorView().setSystemUiVisibility(uiVisibility);
        }
        setContentView(R.layout.layout_percent);

        // 避开刘海屏的两种方式
        // 第一种: 设置布局第一个 View 的 topMargin 为状态栏的高度
        // 第二种:设置布局跟View 的topPadding 为状态栏的高度

        // 第一种
        TextView topView = findViewById(R.id.top_view);
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) topView.getLayoutParams();
        layoutParams.topMargin = heightForDisplayCutout();
        topView.setLayoutParams(layoutParams);
        // 第二种
        RelativeLayout containerView = findViewById(R.id.container);
        containerView.setPadding(
                containerView.getPaddingLeft(),
                heightForDisplayCutout(),
                containerView.getPaddingRight(),
                containerView.getPaddingBottom());
    }

    /***
     * 是否是刘海屏
     * @param window
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.P)
    private boolean hasDisplayCutout(Window window){
        WindowInsets insets = window.getDecorView().getRootWindowInsets();
        DisplayCutout displayCutout;
        // Android 9.0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && insets!=null){
            displayCutout = insets.getDisplayCutout();
            if (displayCutout!=null){
                if (displayCutout.getBoundingRects() !=null && displayCutout.getBoundingRects().size()>0 && displayCutout.getSafeInsetTop() > 0){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 计算状态栏高度(注:通常情况下,刘海的高度就是状态栏的高度)
     * @return
     */
    private int heightForDisplayCutout(){
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId>0){
            return getResources().getDimensionPixelSize(resId);
        }
        return 96;
    }
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:56:30  更:2022-02-06 13:58:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:40:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码