unity 安卓适配刘海屏,水滴屏,异性屏

news/2024/11/22 19:34:44/

手机厂商一群弄潮儿,每次都能玩出新花样,各种奇形怪状的手机屏幕,为了增加玩家的沉浸感,我们开发游戏的话必须对异性屏幕进行适配。

一般安卓方法适配其实网上有很多方案了,主流的一套还是谷歌官方的接口,挖孔屏

首先是安卓p版本(apilv 28)以下的适配

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P){String result = getNotchByManufacturer();return;}
public static String getNotchByManufacturer(){Context context = UnityPlayer.currentActivity;String manufacturer = Build.MANUFACTURER.toLowerCase();String result = MANU_NONE;if(TextUtils.equals(manufacturer, "huawei")){if (hasNotchInHuawei(context))result = NOTCH_TYPE_HUAWEI;}else if(TextUtils.equals(manufacturer, "xiaomi")){if (hasNotchInMIUI(context))result = NOTCH_TYPE_MIUI;}else if(TextUtils.equals(manufacturer, "oppo")){if (hasNotchInOppo(context))result = NOTCH_TYPE_OPPO;}else if(TextUtils.equals(manufacturer, "vivo")){if (hasNotchInVivo(context))result = NOTCH_TYPE_VIVO;}else if(TextUtils.equals(manufacturer, "smartisan")){if (hasNotchInSmart(context))result = NOTCH_TYPE_SMART;}elseresult = ApiUnsupported;return result;}

一般手机厂商都会给适配方案的

<meta-data
 android:name="notch.config"
 android:value="portrait|landscape"/>

使用该接口。在 Application 下增加一个 meta-data,是否使用耳朵区域

华为:https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114
小米:https://dev.mi.com/console/doc/detail?pId=1293
Oppo:https://open.oppomobile.com/service/message/detail?id=61876
Vivo:https://dev.vivo.com.cn/documentCenter/doc/103
 

public static boolean hasNotchInMIUI(Context context){try{return SystemProperties.getInt("ro.miui.notch", 0) == 1;}catch(Exception e){e.printStackTrace();}return false;}/*** OPPO** @param context Context* @return hasNotch*/public static boolean hasNotchInOppo(Context context){return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");}/*** VIVO* <p>* android.util.FtFeature* public static boolean isFeatureSupport(int mask);* <p>* 参数:* 0x00000020表示是否有凹槽;* 0x00000008表示是否有圆角。** @param context Context* @return hasNotch*/private static int VIVO_NOTCH = 0x00000020;//是否有刘海private static int VIVO_FILLET = 0x00000008;//是否有圆角public static boolean hasNotchInVivo(Context context){boolean hasNotch = false;try{ClassLoader cl = context.getClassLoader();Class FtFeature = cl.loadClass("android.util.FtFeature");Method method = FtFeature.getMethod("isFeatureSupport", int.class);hasNotch = (boolean) method.invoke(FtFeature, VIVO_NOTCH);}catch (Exception e){e.printStackTrace();}return hasNotch;}/*** HUAWEI* com.huawei.android.util.HwNotchSizeUtil* public static boolean hasNotchInScreen()** @param context Context* @return hasNotch*/public static boolean hasNotchInHuawei(Context context){boolean hasNotch = false;try {ClassLoader cl = context.getClassLoader();Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");hasNotch = (boolean) get.invoke(HwNotchSizeUtil);} catch (Exception e) {e.printStackTrace();}return hasNotch;}public static boolean hasNotchInSmart(Context context){boolean hasNotch = false;try{Class<?> DisplayUtilsSmt = Class.forName("smartisanos.api.DisplayUtilsSmt");Method isFeatureSupport = DisplayUtilsSmt.getMethod("isFeatureSupport", int.class);hasNotch = (boolean) isFeatureSupport.invoke(DisplayUtilsSmt, 0x00000001);return hasNotch;}catch (Exception e){e.printStackTrace();}return hasNotch;}

安卓p以上的话,谷歌提供了接口去获取是否支持切口屏幕,并且返回切口的位置大小

 protected static boolean isNotchEnable(Activity activity){DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();if(displayCutout == null || displayCutout.getBoundingRects() == null || displayCutout.getBoundingRects().size() == 0){return false;}return true;}@TargetApi(Build.VERSION_CODES.P)protected static int[] getNotchInfo(Activity activity){int[] notchSize = new int[]{0,0};DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();List<Rect> boundingRects = displayCutout.getBoundingRects();if(boundingRects.size() != 0){Rect rect = boundingRects.get(0);notchSize[0] = rect.width();notchSize[1] = rect.height();}return notchSize;}

这些其实网上有很多教程已经说过了,说一下我遇到的问题吧,

首先是,unity需要勾选安全区域外渲染

不然还是会有缺口,然后,安卓xml里面需要设置

 max_aspect 代表屏幕比例哈,2400/1080 = 2.222;

在适配vivo时遇到个问题,他默认不打开刘海区域,需要在mainactivity 的oncreate加入全面屏

 @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容去延伸进刘海区
private static void SetWindowLayoutInDisplayCutoutMode(Activity act){WindowManager.LayoutParams lp = act.getWindow().getAttributes();lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;act.getWindow().setAttributes(lp);}

 一般刘海适配的方案,在游戏里面就是吧ui缩放,位移,这里面有个回答不错

如何使用unity的ugui适配iPhoneX的齐刘海屏幕? - 知乎

他采取的策略是锚点向中靠拢.

我们游戏是横屏的,我做的是检查屏幕选择,然后挖孔的一方位移.主要使用ScreenOrientation.LandscapeLeft

和Screen.orientation类

if self._isleftOrientation ~= Screen.orientation thenself:RefreshUIWithNotch()self._isleftOrientation = Screen.orientationend

关于锚点还是锚边,不同的策略

AnchorMin和AnchorMax相等的话,就是锚点,直接AnchorPos.x - notchSizeX就行了

如果是stretch的,会随屏幕改变大小,anchorPos.x =AnchorPos.x + notchSizeX * (1 - beginPivot.x)

大概就是这样吧

好家伙,iphone已经不满足张雨绮屏幕了,开始水滴屏了,iPhone我们的策略是iPhone 平台直接写死大小,ios平台rawset(self, "_notchSize", Vector2(70, 200))

               


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

相关文章

0.96寸OLED屏使用详解

如何理解OLED分辨率? 这里0.96寸OLED分辨率是128*64;即OLED显示是128行*64列; 但是由于OLED不能一次控制一个点阵,只能控制8个点阵;而且是垂直方向扫描控制;如下图;因此垂直方向坐标可选为0~7;(8*864);水平方向可选坐标0~127. OLED控制函数 函数参考野火的例程; OLED_I…

dialog 刘海屏、水滴屏、全面屏 全屏显示

// 关键代码 Window window dialog.getWindow();if (window ! null) {window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);window.getDecorView().setPadding(0, 0, 0, 0);window.getDecorView().setBackgroundColor(…

基于ENVI的遥感影像解译——以Landsat8数据为例(上)

遥感影像解译是一种指从图像获取信息的基本过程。即根据各专业&#xff08;部门&#xff09;的要求&#xff0c;运用解译标志和实践经验与知识&#xff0c;从遥感影像上识别目标&#xff0c;定性、定量地提取出目标的分布、结构、功能等有关信息&#xff0c;并把它们表示在地理…

javaweb中webapp下的文件夹下的jsp访问不到的问题

还真是见了鬼了。。。。。无论怎么改正都访问不到&#xff0c;然后我把文件夹的首字母改成了小写的&#xff0c;它居然又行了。。。。。我到现在还一脸懵&#xff0c;另一个系统我就用的大写&#xff0c;那个就没事儿&#xff0c;怎么这个非得改成小写&#xff1f;&#xff1f;…

长沙安克创新Java实习面试

长沙安克创新面经&#xff08;凉&#xff09; 一面&#xff08;视频面40分钟&#xff09;5.17面 5.22过 只记得这么多了&#xff0c;应该还忘了一些。 自我介绍 ArrayList和LinkedList的区别&#xff0c;适用场景 常见的集合类 一条SQL的执行过程 刚好看过小林的MySql&…

海外云服务器哪个性价比高?看这篇就够了!

越来越多的企业和站长们&#xff0c;在选择云服务器的时候&#xff0c;主要参考的是价格、性能和新性价钱比这几个方面来选择的云服务器。云服务器的性价比通常是需要考虑到实际需求、价格等整体情况来选择&#xff0c;那么&#xff0c;海外云服务器哪个性价比高呢&#xff1f;…

新手小白如何挑选吉他,附几款超高性价比吉他推荐

什么才是一款好吉他&#xff1f;适合自己的就是好吉他。新手如何挑选适合自己的吉他牌子&#xff0c;相信你看完这篇文章后就有答案了。废话不多说&#xff0c;进入正题。 一、吉他分类&#xff08;按材质分&#xff09;。 1、合板吉他 “合板”指用木头碎片高压压成的人造木…

违禁词管理

目录 一、添加违禁词 1.添加一个违禁词 2.批量添加违禁词 二、违禁词实时检测 三、查看违禁词 四、删除违禁词 1.删除一个违禁词 2.批量删除违禁词 五、清空违禁词 一、添加违禁词 1.添加一个违禁词 添加违禁词 ?([\s\S]*) b:$读 违禁词/%群号% a []$ 如果:%括号1% 请…