Android刘海屏、水滴屏全面屏适配详解,androidui基础教程

news/2024/10/16 19:26:11/

适配方式

适配方式有两种:

  1. 将targetSdkVersion版本设置到API 24及以上;

这个操作将会为<application> 标签隐式添加一个属性,android:resizeableActivity=“true”, 该属性的作用后面将详细说明。

  1. 在 标签中增加属性:android:resizeableActivity=“false”,同时在节点下增加一个meta-data标签:

原理说明

在 Android 7.0(API 级别 24)或更高版本的应用,android:resizeableActivity属性默认为true(对应适配方式1)。这个属性是控制多窗口显示的,决定当前的应用或者Activity是否支持多窗口。

可以在清单的<activity>或 <application>节点中设置该属性,启用或禁用多窗口显示,配置如下:

android:resizeableActivity=[“true” | “false”]

如果该属性设置为 true,Activity 将能以分屏和自由形状模式启动。 如

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

果此属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。

适配方式2即为设置屏幕的最大长宽比,这是官方提供的设置方式。
如果设置了最大长宽比,必须android:resizeableActivity=“false”。 否则最大长宽比没有任何作用。

适配刘海屏

Android9.0适配

Android P(9.0)开始,官方开始提供了官方的挖孔屏适配API,具体可以参考Support display cutouts。
通过Android P提供的 DisplayCutout 类,可以确定非功能区域的位置和形状,这些区域不应显示内容。 要确定这些凹口屏幕区域是否存在及其位置,请使用 getDisplayCutout() 函数。

全新的窗口布局属性 layoutInDisplayCutoutMode 让您的应用可以为设备凹口屏幕周围的内容进行布局。 您可以将此属性设为下列值之一:

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

默认值是LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,刘海区域不会显示内容,需要显示时可以将值设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES。

您可以按如下步骤在任何运行 Android P 的设备或模拟器上模拟屏幕缺口:

  1. 启用开发者选项;
  2. 在 Developer options 屏幕中,向下滚动至 Drawing 部分并选择 Simulate a display with a cutout。

适配参考示例:

// 延伸显示区域到刘海
WindowManager.LayoutParams lp = window.getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(lp);
// 设置页面全屏显示
final View decorView = window.getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

其中延伸显示区域到刘海的代码,也可以通过修改Activity或应用的style实现,例如:

<?xml version="1.0" encoding="utf-8"?>

Android O 适配

因Google官方的适配方案到Android P才推出,因此在Android O(8.0版本)设备上,各家厂商有自己的实现方案。

华为Android O适配

方案一:

  1. 具体方式如下所示:
  1. 对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理。例如:








  1. 对Activity生效,意味着可以针对单个页面进行刘海屏适配,设置了该属性的Activity系统将不会做特殊处理。例如:




方案二:
对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理。

1,设置应用窗口在华为刘海屏手机使用刘海区。

/刘海屏全屏显示FLAG/
public static final int FLAG_NOTCH_SUPPORT=0x00010000;
/**

  • 设置应用窗口在华为刘海屏手机使用刘海区
  • @param window 应用页面window对象
    */
    public static void setFullScreenWindowLayoutInDisplayCutout(Window window) {
    if (window == null) {
    return;
    }
    WindowManager.LayoutParams layoutParams = window.getAttributes();
    try {
    Class layoutParamsExCls = Class.forName(“com.huawei.android.view.LayoutParamsEx”);
    Constructor con=layoutParamsExCls.getConstructor(LayoutParams.class);
    Object layoutParamsExObj=con.newInstance(layoutParams);
    Method method=layoutParamsExCls.getMethod(“addHwFlags”, int.class);
    method.invoke(layoutParamsExObj, FLAG_NOTCH_SUPPORT);
    } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |InstantiationException
    | InvocationTargetException e) {
    Log.e(“test”, “hw add notch screen flag api error”);
    } catch (Exception e) {
    Log.e(“test”, “other Exception”);
    }
    }

2.清除添加的华为刘海屏Flag,恢复应用不使用刘海区显示。

public static void setNotFullScreenWindowLayoutInDisplayCutout (Window window) {
if (window == null) {
return;
}
WindowManager.LayoutParams layoutParams = window.getAttributes();
try {
Class layoutParamsExCls = Class.forName(“com.huawei.android.view.LayoutParamsEx”);
Constructor con=layoutParamsExCls.getConstructor(LayoutParams.class);
Object layoutParamsExObj=con.newInstance(layoutParams);
Method method=layoutParamsExCls.getMethod(“clearHwFlags”, int.class);
method.invoke(layoutParamsExObj, FLAG_NOTCH_SUPPORT);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |InstantiationException
| InvocationTargetException e) {
Log.e(“test”, “hw clear notch screen flag api error”);
} catch (Exception e) {
Log.e(“test”, “other Exception”);
}
}

小米Android O适配

  1. 判断是否是刘海屏。

private static boolean isNotch() {
try {
Method getInt = Class.forName(“android.os.SystemProperties”).getMethod(“getInt”, String.class, int.class);
int notch = (int) getInt.invoke(null, “ro.miui.notch”, 0);
return notch == 1;
} catch (Throwable ignore) {
}
return false;
}

  1. 设置显示到刘海区域

@Override
public void setDisplayInNotch(Activity activity) {
int flag = 0x00000100 | 0x00000200 | 0x00000400;
try {
Method method = Window.class.getMethod(“addExtraFlags”,
int.class);
method.invoke(activity.getWindow(), flag);
} catch (Exception ignore) {
}
}

Activity activity) {
int flag = 0x00000100 | 0x00000200 | 0x00000400;
try {
Method method = Window.class.getMethod(“addExtraFlags”,
int.class);
method.invoke(activity.getWindow(), flag);
} catch (Exception ignore) {
}
}


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

相关文章

Android刘海屏、水滴屏全面屏适配详解大厂直通车!

为什么想跳槽&#xff1f; 简单说一下当时的状况&#xff0c;我在这家公司做了两年多&#xff0c;这两年多完成了一个大项目&#xff0c;作为开发的核心主力&#xff0c;开发压力很大&#xff0c;特别是项目上线前的几个月是非常辛苦&#xff0c;几乎每晚都要加班到12点以后&a…

Android适配全面屏/刘海屏

目前国内厂商已经推出的刘海屏Android手机有华为P20 pro&#xff0c; vivo X21&#xff0c;OPPO R15。 1.华为刘海屏的官方适配文档 https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114 2.oppo刘海屏官方文档&#xff1a; https://open.oppomobile.com/…

浅谈Maven依赖冲突与依赖管理

目录 什么是依赖冲突 为什么会产生冲突 依赖冲突的解决和避免 Maven的仲裁机制

网络安全真的那么好吗?

当你开始在网上搜索关于网络安全的学习资料&#xff0c;常常会陷入自我怀疑&#xff1a;尝试自学后能使用工具进行简单的扫描和挖洞&#xff0c;但总感觉后期学习很难有突破&#xff0c;不知道是哪里出现问题…于是又不得不推倒重来。 了解网络安全&#xff0c;首先要搞清楚下…

django-vue-admin使用

一、源码地址 注意&#xff0c;一定要使用这个地址。&#xff08;使用其他地址下载下来的感觉代码缺失&#xff0c;踩了大坑&#xff09; django-vue-admin: 基于RBAC模型的权限控制的一整套基础开发平台&#xff0c;前后端分离&#xff0c;后端采用 djangodjango-rest-frame…

无线鼠标好用吗

无线鼠标最大的优势就是可以距离电脑更远&#xff0c;实现较远地方操作&#xff0c;适合家用HTPC用户以及追求极致的无线体验用户。比起有线键鼠左一条线&#xff0c;右一条线&#xff0c;可以保证电脑桌面的简洁&#xff0c;省掉了线路连接的杂乱。如果是商旅办公人士经常需要…

哪个牌子的蓝牙耳机好?防水蓝牙耳机品牌

随着人们物质生活水平的提高&#xff0c;人们总是吃一些高热量商品&#xff0c;身体也随着发福&#xff0c;这时侯就会开始运动&#xff0c;在刚开始运动的时侯总是容易想着放弃&#xff0c;这时侯就需要音乐来帮助他忘记放弃这件事情&#xff0c;然而运动总是会产生汗水&#…

蓝牙耳机什么牌子好?高性价比蓝牙耳机品牌推荐

最近看了网上很多朋友对于蓝牙耳机挑选这一项事情很是头疼&#xff0c;因为选购蓝牙耳机并不是只需要看外观就行&#xff0c;也需要综合配置参数、以及价格等方面来决定要不要入手&#xff0c;如果光是看外表就直接买了的话&#xff0c;很容易买回来不如意&#xff0c;这种用又…