UE4:安卓弹出窗口模式背景Splash显示问题

问题描述

在之前
解决安卓分屏模式下分辨率异常的问题时,发现了在弹出窗口模式下背景Splash比游戏的窗口大的问题,如图:

背景Splash突出

希望可以关闭或者隐藏背景板

尝试思路

以下是探索过程不是解决办法可以跳过
以下是探索过程不是解决办法可以跳过
以下是探索过程不是解决办法可以跳过

由于只能看出来这是splash,换图测试一下确认是splash,所以就按照弹出窗口没有关闭splash去寻找解决方案,于是找到了这个

stackoverflow的一个相关问题

然后看了一眼AndroidManifest.xml,发现:

1
2
3
4
5
6
7
8
9
10
<application android:label="@string/app_name" android:icon="@drawable/icon" android:resizeableActivity="false" android:isGame="true" android:hardwareAccelerated="true" android:extractNativeLibs="true" android:name="com.epicgames.ue4.GameApplication" android:requestLegacyExternalStorage="true" android:hasCode="true">
<activity android:name="com.epicgames.ue4.SplashActivity" android:label="@string/app_name" android:theme="@style/UE4SplashTheme" android:launchMode="singleTask" android:screenOrientation="sensorLandscape" android:debuggable="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.epicgames.ue4.GameActivity" android:label="@string/app_name" android:theme="@style/UE4SplashTheme" android:configChanges="mcc|mnc|uiMode|density|screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden|keyboard" android:resizeableActivity="false" android:launchMode="singleTask" android:screenOrientation="sensorLandscape" android:debuggable="true">
<meta-data android:name="android.app.lib_name" android:value="UE4" />
</activity>

哎嘿,这不就是两个Activity嘛,想想办法关了它

于是尝试在GameActivity.Java.template的各种地方按照Stack Overflow那个问题里的方案尝试,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public void onMultiWindowModeChanged (boolean isInMultiWindowMode)
{
super.onMultiWindowModeChanged(isInMultiWindowMode);
Log.debug("onMultiWindowModeChanged : isInMultiWindowMode: " + String.valueOf(isInMultiWindowMode));
PackageManager pm = getPackageManager();
ComponentName componentName = new ComponentName(this, SplashActivity.class);
Log.debug(componentName.getClassName());
Log.debug(componentName.getPackageName());
Log.debug(String.valueOf(pm.getComponentEnabledSetting(componentName)));
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}

打包测试发现pm.setComponentEnabledSetting会导致崩溃,于是又用Android Studio调试了一下,确认ComponentName的创建是没有问题的,问题就是setComponentEnabledSetting这一步,但是由于本人完全没接触过安卓开发相关,只能试图从搜索引擎查找一下可能的问题

然后就陷入了僵局,但是有看到一个地方说要在Activity的地方加一个android:exported,加上之后还是没有用,但是在看XML中的SplashActivity定义的时候发现:android:theme="@style/UE4SplashTheme"

由于我在看这个文件的时候,是用的Android Studio,并打开了我build的gradle,我试图按了一下F12,他就跳转过去了= =

到了Engine\Build\Android\Java\res\values-land\styles.xml这个文件(因为我们只改了landscape的splash)并看到了如下代码

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="UE4BaseTheme" parent = "@android:style/Theme.Black.NoTitleBar.Fullscreen" />

<style name="UE4SplashTheme" parent = "UE4BaseTheme">
<item name="android:windowBackground">@drawable/splashscreen_l</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>

</resources>

长得好像html啊- -然后看看这几个单词,好像就是splash的相关配置啊!windowNoTitle就是不要标题,windowFullscreen就是全屏

我试着在IDE里敲window,就跟出来了一个windowClipToOutline

= =啊这,Clip,裁剪,是不是就是把SplashActivity给裁减了呢

加上去试了一下-=-真的可以耶……

解决方案

Engine\Build\Android\Java\res目录下的values-landvalues-port里面的styles.xml文件中给UE4SplashTheme的style加上

1
<item name="android:windowClipToOutline">true</item>

就可以解决问题了

总结

遇到安卓问题就快去西天(划掉)请一位安卓开发的带佬!不要浪费自己的头发(泪


UE4:安卓弹出窗口模式背景Splash显示问题
http://muchenhen.com/posts/61295/
作者
木尘痕
发布于
2022年10月26日
许可协议