小米8刘海屏适配

news/2025/1/16 0:04:18/

1.前言

最近在开发一个小说阅读器APP,在阅读界面碰到了适配问题,把解决问题的方法及过程记录一下。因为我只有小米8一个测试机,所以方法不保证其他手机的兼容性,只是提供一个思路,希望能给到其他人帮助。

2.全面屏适配

在Android 7.0以后,google提供了在通过在AndroidManifest.xml文件中进行声明android:resizeableActivity = “true” 来开启分屏模式的开关,且自动适应了全面屏。此外,我们可以手动设置最大屏幕宽高比。

android8.0及以上:

<activity android:maxAspectRatio="2.1">...
</activity>

android7.1及以下版本:

<meta-data android:name="android.max_aspect" android:value="2.1" />

value值需要大于等于2.1,需要注意的是,如果手动进行设置了最大宽高比,一定要将多窗口模式设置为false,否则不生效。

3.刘海屏适配

从Android P开始,google提供了刘海屏适配的方案,提供了全新的 DisplayCutout 类,通过 DisplayCutout 类可以确定非功能区域的位置和形状。我们可以通过使用DisplayCutout 类中的getSafeInsetLeft ()、getSafeInsetRight ()、getSafeInsetTop ()、getSafeInsetBottom ()来分别获取安全区域距离屏幕左边、右边、上方、下方的距离,单位是px。

View decorView = getWindow().getDecorView();decorView.post(new Runnable() {@Overridepublic void run() {DisplayCutout displayCutout = decorView.getRootWindowInsets().getDisplayCutout();displayCutout.getSafeInsetLeft();displayCutout.getSafeInsetRight();displayCutout.getSafeInsetTop();displayCutout.getSafeInsetBottom();
});

除此此外,从Android P开始,google在WindowManager中新增了layoutInDisplayCutoutMode 布局参数属性,包含三种模式:

//默认情况,全屏页面不可用刘海区域,非全屏页面可以进行使用
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
//不允许使用刘海区域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
//允许页面延伸到刘海区域
public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;

因为我需要开发的是一个小说阅读界面,使用刘海区域会导致不太美观,因此我采用了不允许使用刘海区域 的模式。

4.小米8(MIUI10)获取宽高

在开发小说阅读界面时,因为界面的绘制是通过获取屏幕的宽高来实现的,所以需要获取手机的宽和高。网上较多获取宽高的方法是通过下面实现的:

WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;
int density = outMetrics.density;

但是使用该方法获取宽高后,在我的手机下方会出现一个黑条,很不美观。原因是因为该方法获取的是去除虚拟按键(导航栏)后的宽高,因为我的手机是使用的全面屏手势,没有使用虚拟按键,因此我们需要使用

manager.getDefaultDisplay().getRealMetrics(outMetrics);

来获取包含虚拟按键的宽高。

但是因为前面所说,我使用了不允许使用刘海屏的模式,因此会造成View下移,出现View超出屏幕的情况。我们知道是因为刘海屏的问题造成的,因此我们只需要去除刘海屏的高度便可以了。

此外,因为Build.VERSION.SDK_INT >= 28 时,才能调用官方接口,因此我们可以减去状态栏高度的方法进行适配,但是此方法仅适用于刘海屏高度小于状态栏高度的问题。

WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int tempWidth = outMetrics.widthPixels;
int tempHeight = outMetrics.heightPixels;
int tempDensity = outMetrics.density;
int resourceId  = BookApp.mContext.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId >0 && resourceId != null) {int statusBarHeight = BookApp.mContext.getResources().getDimensionPixelSize(resourceId);if (statusBarHeight!=null)tempHeight = (int)(tempHeight- (statusBarHeight / tempDensity + 0.5f)); //将dip转为px然后减去
}

 


http://www.ppmy.cn/news/462588.html

相关文章

小米8原生Android9,小米8,Android9.0 crash

这个是语音合成sdkdemo里报的错&#xff0c;这是不是也是 28编译产物在android9.0上运行的问题 --------- beginning of crash E/AndroidRuntime: FATAL EXCEPTION: Thread-28 Process: com.baidu.tts.sample, PID: 413 java.lang.NoClassDefFoundError: Failed resolution of…

小米8配哪个版本的MIUI?

小米8之前我是忠实的魅粉&#xff0c;魅族手机用过M8&#xff0c;MX3&#xff0c;note5&#xff0c;MX6 pro。 魅族真的是被联发科的cpu坑了&#xff0c;一核有难&#xff0c;八核围观。 入手小米8&#xff0c;miui是9&#xff0c;一路跟着系统自动更新&#xff0c;更新到了12。…

【Ubuntu touch for xiaomi 8】小米8第三方ROM

1. 下载相关资源 1.1 TWRP(点击下载) twrp对应的版本为Android 9&#xff0c;高版本的Twrp可能无法刷入固件和镜像。 1.2 固件和镜像的压缩包(点击下载) 1.3 boot.img,system.img&recovery.img(点击下载&#xff0c;提取码&#xff1a;tdbk) 2. 安装过程 2.1 格式化D…

使用omp并行技术加速bfs广度优先算法

基本思想 从初始状态S开始&#xff0c;利用规则&#xff0c;生成所有可能的状态。构成树的下一层节点&#xff0c;检查是否出现目标状态G&#xff0c;若未出现&#xff0c;就对该层所有状态节点&#xff0c;分别顺序利用规则。生成再下一层的所有状态节点&#xff0c;对这一层的…

webpack-demo001,入门项目

webpack-demo001 环境初始化项目新增src目录内容修改webpack配置文件修改运行脚本运行 环境 # npm -v 6.14.17# node -v v14.20.0开发工具&#xff1a;使用 vs code 开发 初始化项目 新增文件夹webpack-demo001&#xff0c;并进入 npm init -y npm i -D webpack webpack-cli…

linux虚拟服务器常见问题处理(后期续更)

linux命令总结 一、 重启网卡失败1. 错误提示 Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. [FAILED]2. 原因分析&#xff1a;新克隆的服务器没有正确的MAC地址,UUID信息冲突导致的3. 解决方案&#xff1a; 二. 连接历史目标…

wget下载HTTPS链接

wget -c -O master.zip --no-check-certificate https://github.com/mitsuhiko/flask/archive/master.zip# master.zip 为文件名 # https://... 为链接 wget是linux最常用的下载命令, 通常的运用要领是: “wget 空格要下载文件的url路径”。 比方 : [linux]# wget http://www.t…

rk3568 长按电源键关机修改

rk3568 电源键强制关机触发时间修改 Rockchip系列主控芯片配套PMIC支持长按电源键强制关闭PMU&#xff0c;也就是标题中的强制关机。rk3568使用I2C通信与PMIC(rk809/rk817)&#xff0c;power(电源)键则是与PMIC相连&#xff0c;PMIC监测按键状态控制RK3568的上下电&#xff0c;…