如何实现透明的FlutterActivity

背景

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

修改密码-未输入.png

官方解决方案(无效

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

  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。

猜你喜欢

转载自juejin.im/post/7098921431102128165