为您的 Android 应用添加启动画面
启动画面(也称为加载画面)在您的 Android 应用加载期间提供了一个简单的初始体验。它们为您的应用设置了舞台,同时留出时间让应用引擎加载并初始化您的应用。
概述
#在 Android 中,您可以控制两个独立的屏幕:在 Android 应用初始化时显示的启动画面,以及在 Flutter 体验初始化时显示的启动画面。
初始化应用
#每个 Android 应用在操作系统设置应用进程时都需要初始化时间。Android 提供了启动画面的概念,以便在应用初始化时显示Drawable
。启动画面
Drawable
是 Android 图形。要了解如何在 Android Studio 中将Drawable
添加到您的 Flutter 项目中,请查看 Android 开发人员文档中的将 drawable 导入您的项目。
默认的 Flutter 项目模板包含启动主题和启动背景的定义。您可以通过编辑styles.xml
来自定义它,您可以在其中定义一个主题,其windowBackground
设置为应显示为启动画面的Drawable
。
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
此外,styles.xml
定义了一个普通主题,该主题将在启动画面消失后应用于FlutterActivity
。普通主题背景仅在启动画面消失后以及在方向更改和Activity
恢复期间显示很短的时间。因此,建议普通主题使用与 Flutter UI 的主要背景颜色相似的纯色背景。
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@drawable/normal_background</item>
</style>
在 AndroidManifest.xml 中设置 FlutterActivity
#在AndroidManifest.xml
中,将FlutterActivity
的theme
设置为启动主题。然后,将元数据元素添加到所需的FlutterActivity
中,以指示 Flutter 在适当的时间从启动主题切换到普通主题。
<activity
android:name=".MyActivity"
android:theme="@style/LaunchTheme"
// ...
>
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
现在,Android 应用在应用初始化时显示所需的启动画面。
Android 12
#要配置 Android 12 上的启动画面,请查看Android 启动画面。
从 Android 12 开始,您必须在styles.xml
文件中使用新的启动画面 API。考虑为 Android 12 及更高版本创建备用资源文件。还要确保您的背景图像符合图标指南;有关更多详细信息,请查看Android 启动画面。
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowSplashScreenBackground">@color/bgColor</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/launch_background</item>
</style>
确保在清单中未设置io.flutter.embedding.android.SplashScreenDrawable
,并且未实现provideSplashScreen
,因为这些 API 已弃用。这样做会导致 Android 启动画面在应用启动时平滑地淡入 Flutter,并且应用可能会崩溃。
某些应用可能希望继续在 Flutter 中显示 Android 启动画面的最后一帧。例如,这在 Dart 中继续进行其他加载时,保留了单帧的错觉。为了实现这一点,以下 Android API 可能会有所帮助
import android.os.Build
import android.os.Bundle
import androidx.core.view.WindowCompat
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Aligns the Flutter view vertically with the window.
WindowCompat.setDecorFitsSystemWindows(getWindow(), false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// Disable the Android splash screen fade out animation to avoid
// a flicker before the similar frame is drawn in Flutter.
splashScreen.setOnExitAnimationListener { splashScreenView -> splashScreenView.remove() }
}
super.onCreate(savedInstanceState)
}
}
import android.os.Build;
import android.os.Bundle;
import android.window.SplashScreenView;
import androidx.core.view.WindowCompat;
import io.flutter.embedding.android.FlutterActivity;
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Aligns the Flutter view vertically with the window.
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// Disable the Android splash screen fade out animation to avoid
// a flicker before the similar frame is drawn in Flutter.
getSplashScreen()
.setOnExitAnimationListener(
(SplashScreenView splashScreenView) -> {
splashScreenView.remove();
});
}
super.onCreate(savedInstanceState);
}
}
然后,您可以在 Flutter 中重新实现第一帧,该帧在屏幕上的相同位置显示 Android 启动画面的元素。有关此示例,请查看Android 启动画面示例应用。
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-06-26。 查看源代码 或 报告问题。