我的启动画面结束得太早了。如何在 Android 上手动隐藏启动画面?

Posted

技术标签:

【中文标题】我的启动画面结束得太早了。如何在 Android 上手动隐藏启动画面?【英文标题】:My splash screen ends too early. How can I manually hide a splash screen on Android? 【发布时间】:2022-01-02 00:13:19 【问题描述】:

我为我的 android 游戏创建了启动画面主题。但问题是我的启动画面在 OnCreate(Bundle bundle) 完全执行后自动结束,这导致在执行 Draw(GameTime gameTime) 之前出现黑屏。我在 Draw(GameTime gameTime) 中绘制我的游戏精灵。因此,在执行 Draw(GameTime gameTime) 之前一直黑屏。

当我的游戏代码已经达到 Draw(GameTime gameTime) 时,是否可以手动结束启动画面?我不希望在 OnCreate(Bundle bundle) 完全执行时启动画面已经结束。

splash_screen_svg.xml:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:
android:
android:viewportWidth="84.666664"
android:viewportHeight="127">
<path
  android:pathData="M0.529,0.529h83.608v125.942h-83.608z"
  android:strokeWidth="1.05833"
  android:fillColor="#00ffff"
  android:strokeColor="#000000"/>
<path
  android:pathData="M21.431,32.015h41.804v62.971h-41.804z"
  android:strokeWidth="0.529167"
  android:fillColor="#ff0000"
  android:strokeColor="#000000"/>
</vector>

colors.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
  <color name="splash_background">#eff1f7</color>
</resources>

字符串.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">splashapp</string>
</resources>

styles.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
 <style name="MainTheme" parent="MainTheme.Base">
</style>
<!-- Base theme applied no matter what API -->
<style name="MainTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
    <item name="android:windowNoTitle">true</item>
    <!--We will be using the toolbar so no need to show ActionBar-->
    <item name="android:windowActionBar">false</item>
     <item name="android:windowFullscreen">true</item>
    <!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette -->
    <!-- colorPrimary is used for the default action bar background -->
    <item name="android:colorPrimary">#2196F3</item>
    <!-- colorPrimaryDark is used for the status bar -->
    <item name="android:colorPrimaryDark">#1976D2</item>
    <!-- colorAccent is used as the default value for colorControlActivated
     which is used to tint widgets -->
    <item name="android:colorAccent">#FF4081</item>
    <!-- You can also set colorControlNormal, colorControlActivated
     colorControlHighlight and colorSwitchThumbNormal. -->
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>
<style name="SplashTheme" parent ="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen_svg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
</resources>

Activity1.cs:

namespace splashapp

[Activity(
    Label = "@string/app_name",
    MainLauncher = true,
    Theme = "@style/SplashTheme",
    Icon = "@drawable/icon",
    AlwaysRetainTaskState = true,
    LaunchMode = LaunchMode.SingleInstance,
    ScreenOrientation = ScreenOrientation.FullUser,
    ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.ScreenSize
)]
public class Activity1 : AndroidGameActivity

    private Game1 _game;
    private View _view;

    protected override void OnCreate(Bundle bundle)
    
        base.SetTheme(Resource.Style.MainTheme);
        base.OnCreate(bundle);
        _game = new Game1();
        _view = _game.Services.GetService(typeof(View)) as View;
        SetContentView(_view);
        _game.Run();
    


Game1.cs:

namespace splashapp

public class Game1 : Game

    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch;

    public Game1()
    
        _graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    

    protected override void Initialize()
    
        base.Initialize();
    

    protected override void LoadContent()
    
        _spriteBatch = new SpriteBatch(GraphicsDevice);
        
        // TODO: use this.Content to load your game content here
    

    protected override void Update(GameTime gameTime)
    
        // TODO: Add your update logic here

        base.Update(gameTime);
    

    protected override void Draw(GameTime gameTime)
    
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here

        base.Draw(gameTime);
    


My solution picture

【问题讨论】:

我认为有些应用程序只是将初始屏幕表示为一个视图。为什么要降低用户体验? 我想显示一个启动画面/矢量图像,因为当用户启动我的游戏时,如果黑屏显示时间过长(几秒钟),用户可能会认为我的游戏已经崩溃。 @DanielA.White 如何将初始屏幕作为视图?是否可以使用我的 splash_screen_svg.xml 或 svg 文件?我不知道如何将启动画面作为视图。 【参考方案1】:

是否可以使用我的 splash_screen_svg.xml 或 svg 文件?

在drawable文件夹中创建一个splash_screen.xml。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item>
   <color android:color="@color/splash_background"/>
 </item>
  <item>
  <bitmap
    android:src="@drawable/splash_logo"
    android:tileMode="disabled"
    android:gravity="center"/>
  </item>
</layer-list>

在 Resources/values/colors.xml 中添加特定颜色。

<?xml version="1.0" encoding="utf-8"?>
<resources>
  ...
  <color name="splash_background">#FFFFFF</color>
</resources>

在 Resources/values/styles.xml 中创建主题

 <style name="Theme_SplashScreen" parent ="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowActionBar">true</item>

在 Activity_SplashScreen 活动中加载启动画面。

 [Activity(Label = "Activity_SplashScreen", Theme = "@style/Theme_SplashScreen", MainLauncher = true)]
public class Activity_SplashScreen : Activity

    protected override void OnCreate(Bundle savedInstanceState)
    
        base.OnCreate(savedInstanceState);

        // Create your application here
    
    protected override void OnResume()
    
        base.OnResume();
        Task startupWork = new Task(() =>  SimulateStartup(); );
        startupWork.Start();
    
    // Simulates background work that happens behind the splash screen
    async void SimulateStartup()
                 
        await Task.Delay(3000); // Simulate a bit of startup work.            
        StartActivity(new Intent(Application.Context, typeof(Activity_Screen)));
    

Activity_Screen 活动:

 [Activity(Label = "Activity_Screen")]
public class Activity_Screen : Activity

    protected override void OnCreate(Bundle savedInstanceState)
    
        base.OnCreate(savedInstanceState);

        // Create your application here
        SetContentView(Resource.Layout.layout_Screen);
        Toast.MakeText(this, "Welcome to MainActivity", ToastLength.Long).Show();
    

【讨论】:

我需要以不同的方式创建启动屏幕,因为我希望启动屏幕仅在我的代码到达 Game1.cs 中的某个点时才会消失。我使用 ImageView 创建启动画面,但我的游戏开始时仍然出现白屏问题:***.com/questions/70086895/… 您可以在某个时间点调用闪屏活动并使用线程延迟或睡眠来保持闪屏几秒钟。然后运行游戏。我不确定白屏是由活动还是游戏引起的。但如果是 Activity,你可以尝试设置ActivityFlags.NoAnimation。有时它会修复白屏。检查下面的链接。 ***.com/questions/61596142/…

以上是关于我的启动画面结束得太早了。如何在 Android 上手动隐藏启动画面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit SKScene 类中启动 ReplayKit 屏幕录制

***Error 太早了

Robolectric 和 Android SDK 29

UITextField 辞职 firstResponder 太早了

Wix XmlFile 元素执行得太早

我在哪里设置我的 iPhone 应用程序的版本?