Android刘海屏、水滴屏全面屏适配小结

Android刘海屏、水滴屏全面屏适配小结

2023年6月27日发(作者:)

Android刘海屏、⽔滴屏全⾯屏适配⼩结现在,市⾯上的屏幕尺⼨和全⾯屏⽅案五花⼋门。这⾥我使⽤了⼩⽶的图来说明:上述两种屏幕都可以统称为刘海屏,不过对于右侧较⼩的刘海,业界⼀般称为⽔滴屏或美⼈尖。为便于说明,后⽂提到的「刘海屏」「刘海区」都同时指代上图两种屏幕。刘海屏、⽔滴屏全⾯屏适配细节当我们在谈屏幕适配时,我们具体谈什么呢?适应更长的屏幕防⽌内容被刘海遮挡其中第⼀点是所有应⽤都需要适配的,对应下⽂的声明最⼤长宽⽐,⽽第⼆点,如果应⽤本⾝不需要全屏显⽰或使⽤沉浸式状态栏,是不需要适配的。针对需要适配第⼆点的应⽤,需要获取刘海的位置和宽⾼,然后将显⽰内容避开即可。声明最⼤长宽⽐以前的普通屏长宽⽐为16:9,全⾯屏⼿机的屏幕长宽⽐增⼤了很多,如果不适配的话就会类似下⾯这样:适配⽅式适配⽅式有两种:1. 将targetSdkVersion版本设置到API 24及以上;这个操作将会为 标签隐式添加⼀个属性,android:resizeableActivity="true", 该属性的作⽤后⾯将详细说明。在 标签中增加属性:android:resizeableActivity="false",同时在节点下增加⼀个meta-data标签: 原理说明在 Android 7.0(API 级别 24)或更⾼版本的应⽤,android:resizeableActivity属性默认为true(对应适配⽅式1)。这个属性是控制多窗⼝显⽰的,决定当前的应⽤或者Activity是否⽀持多窗⼝。可以在清单的

节点中设置该属性,启⽤或禁⽤多窗⼝显⽰,配置如下:android:resizeableActivity=["true" | "false"]如果该属性设置为 true,Activity 将能以分屏和⾃由形状模式启动。 如果此属性设置为 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_DEFAULTLAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESLAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER默认值是LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT,刘海区域不会显⽰内容,需要显⽰时可以将值设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES。您可以按如下步骤在任何运⾏ Android P 的设备或模拟器上模拟屏幕缺⼝:启⽤开发者选项;在 Developer options 屏幕中,向下滚动⾄ Drawing 部分并选择 Simulate a display with a cutout。适配参考⽰例:// 延伸显⽰区域到刘海 Params lp = ributes(); InDisplayCutoutMode = _IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; ributes(lp); // 设置页⾯全屏显⽰ final View decorView = orView(); temUiVisibility(_UI_FLAG_LAYOUT_FULLSCREEN | _UI_FLAG_LAYOUT_STABLE);其中延伸显⽰区域到刘海的代码,也可以通过修改Activity或应⽤的style实现,例如: Android O 适配因Google官⽅的适配⽅案到Android P才推出,因此在Android O(8.0版本)设备上,各家⼚商有⾃⼰的实现⽅案。华为Android O适配⽅案⼀:具体⽅式如下所⽰:对Application⽣效,意味着该应⽤的所有页⾯,系统都不会做竖屏场景的特殊下移或者是横屏场景的右移特殊处理。例如: 对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; } Params layoutParams = ributes(); try { Class layoutParamsExCls = e("ParamsEx"); Constructor con=structor(); Object layoutParamsExObj=tance(layoutParams); Method method=hod("addHwFlags", ); (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; } Params layoutParams = ributes(); try { Class layoutParamsExCls = e("ParamsEx"); Constructor con=structor(); Object layoutParamsExObj=tance(layoutParams); Method method=hod("clearHwFlags", ); (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适配判断是否是刘海屏。 private static boolean isNotch() { try { Method getInt = e("Properties").getMethod("getInt", , ); int notch = (int) (null, "", 0); return notch == 1; } catch (Throwable ignore) { } return false; }设置显⽰到刘海区域@Override public void setDisplayInNotch(Activity activity) { int flag = 0x00000100 | 0x00000200 | 0x00000400; try { Method method = hod("addExtraFlags", ); (dow(), flag); } catch (Exception ignore) { } }获取刘海宽⾼public static int getNotchHeight(Context context) { int resourceId = ources().getIdentifier("notch_height", "dimen", "android"); if (resourceId > 0) { return ources().getDimensionPixelSize(resourceId); } return 0; } public static int getNotchWidth(Context context) { int resourceId = ources().getIdentifier("notch_width", "dimen", "android"); if (resourceId > 0) { return ources().getDimensionPixelSize(resourceId); } return 0; }oppo Android O适配判断是否是刘海屏@Override public boolean hasNotch(Activity activity) { boolean ret = false; try { ret = kageManager().hasSystemFeature("morphism"); } catch (Throwable ignore) { } return ret; }获取刘海的左上⾓和右下⾓的坐标private static String getScreenValue() { String value = ""; Class cls; try { cls = e("Properties"); Method get = hod("get", ); Object object = tance(); value = (String) (object, "morphism"); } catch (Throwable ignore) { } return value; }以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687841830a49975.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信