我在Android应用程序中嵌入了一个Unity活动作为片段。一切都很好,只是片段运行后,应用程序的分辨率很有趣。即使重新启动后,它也会保持这种状态。我必须对AndroidManifest进行更改,然后重新安装,才能再次获得正确的解决方案。
以下是安卓应用程序的清单。
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:extractNativeLibs="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".FragmentActivity"
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="adjustNothing">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这是我导入应用程序的unityLibrary中的整个AndroidManifest。
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="fullSensor" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false">
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />-->
<!--<category android:name="android.intent.category.DEFAULT" />-->
<!--</intent-filter>-->
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.notch_support" android:value="true" />
</activity>
<meta-data android:name="unity.splash-mode" android:value="0" />
<meta-data android:name="unity.splash-enable" android:value="True" />
<meta-data android:name="notch.config" android:value="portrait|landscape" />
<meta-data android:name="unity.build-id" android:value="f6e555a5-44fc-47be-9a81-b3809caa8f74" />
</application>
<uses-feature android:glEsVersion="0x00030000" />
<uses-feature android:name="android.hardware.vulkan.version" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>
这是保存碎片的活动。
class FragmentActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_fragment)
}
}
这是碎片本身。
class UnityFragment : Fragment() {
protected var mUnityPlayer: UnityPlayer? = null
var frameLayoutForUnity: FrameLayout? = null
fun UnityFragment() {}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mUnityPlayer = UnityPlayer(activity)
val view = inflater.inflate(R.layout.fragment_unity, container, false)
frameLayoutForUnity =
view.findViewById<View>(R.id.frameLayoutForUnity) as FrameLayout
frameLayoutForUnity!!.addView(
mUnityPlayer!!.view,
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT
)
mUnityPlayer!!.requestFocus()
mUnityPlayer!!.windowFocusChanged(true)
return view
}
override fun onDestroy() {
mUnityPlayer!!.quit()
super.onDestroy()
}
override fun onPause() {
super.onPause()
mUnityPlayer!!.pause()
}
override fun onResume() {
super.onResume()
mUnityPlayer!!.resume()
}
}
这是R.layout.fragment_unity.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frameLayoutForUnity"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UnityFragment"/>
FragmentActivity的布局只是constraintlayout中的一个片段。
我希望有人能给我指明正确的方向,因为我真的不知道屏幕分辨率是如何工作的,也不知道是什么控制它。但根据应用程序其他部分布局的外观,感觉这就是它的相关内容。
我找到了一个解决方案,但它并不是很有启发性。我的意思是,我找到了一种让症状停止的方法。
由于我无法解释的原因,如果我在应用程序Manifest中将hardwareAccelerated设置为true,同时在unityLibrary Manifest中也将notchsupport设置为false,那么我的自定义视图就不再奇怪地绘制画布了。
我知道这看起来像是在下雨或使用探针,但它很有效,我可以稍后重新访问,以实现我理解的实现。
一些注意事项:我的直觉是,我让统一清单在我的应用程序清单上说话,并以某种方式关闭hardwareAccelerated,因为这可以解释画布的绘制方式不同。但是,抑制硬件在统一清单内加速关闭,并在应用程序清单中强制启用硬件本身不足以阻止症状。唯一能阻止症状的方法就是完成所有这些,并关闭notch_support。也许notch_support在某个地方与hardwareAccelerated交互。但我认为更有可能是第三个因素导致了这一切,而这种环境的随机融合偶然地影响了这个因素。
编辑:我已经很久没有问这个问题了。但我看到最近有人可能遇到了同样的问题,对它产生了一些兴趣。我一直不知道问题出在哪里。它只是间歇性地发生,最终停止了。但为了子孙后代的利益,我想说,在任何情况下,出于任何原因,视觉检测到分辨率的变化都表明无法适应不同的屏幕,这可能是这个问题被否决的原因。
因此,如果你也遇到了这个问题,你应该首先看看你在自定义绘制的画布中是否使用了px而不是dp。很多画布绘制方法默认为px,您必须自己规范化为dp。
也可以使用百分比来调整ConstraintLayouts内部的大小。