likes
comments
collection
share

如何实现透明的FlutterActivity

作者站长头像
站长
· 阅读数 18

背景

项目是原生和flutter混编的。 因为需求需要,需要实现一个透明的FlutterActivity。如下图所示

如何实现透明的FlutterActivity

官方解决方案(无效

官方文档有提出一个解决方案:

  1. 使用透明的主题
<style name="MyTheme" parent="@style/MyParentTheme">
  <item name="android:windowIsTranslucent">true</item>
</style>
  1. 将透明主题应用到你的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"
  />
  1. 启动透明的 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。