背景
项目是原生和flutter混编的。 因为需求需要,需要实现一个透明的FlutterActivity。如下图所示
官方解决方案(无效)
官方文档有提出一个解决方案:
- 使用透明的主题
<style name="MyTheme" parent="@style/MyParentTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
- 将透明主题应用到你的FlutterActivity
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/MyTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
- 启动透明的 FlutterActivity
// Using a new FlutterEngine.
startActivity(
FlutterActivity
.withNewEngine()
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(this)
);
// Using a cached FlutterEngine.
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(this)
);
然而这样设置是有误的,会导致崩溃:
java.lang.UnsupportedOperationException: TextureView doesn't support displaying a background drawable
正确的解决方案
上述官方的步骤1和步骤2沿用,步骤3改为在FlutterActivity重写getTransparencyMode()方法
override fun getTransparencyMode(): TransparencyMode {
return TransparencyMode.transparent
}
如此设置,才能实现一个透明的FlutterActivity。