【问题标题】:Android Splash Screen without Splash Activity没有启动活动的 Android 启动画面
【发布时间】:2021-02-25 11:21:00
【问题描述】:

我在我的应用程序中添加了一个启动画面,它可以正常工作。 但是当我在互联网上搜索时,所有关于 android 启动画面的指南和操作说明都不同。
现在我想知道我的解决方案是否有缺点?
我没有额外的启动活动,我的解决方案是为我的主要活动设置背景,一旦加载,应用程序就会显示在背景上。这显着减少了添加启动屏幕的代码。
注意:
我得到了在启动画面和应用程序启动之间显示的白屏的解决方案,但这不是我问题的重点。

这里是 android splash 的重要文件。

Android 样式.xml

<resources>
    <style name="AppTheme" parent="@style/Theme.MaterialComponents.Light.NoActionBar">
        <item name="colorOnActionBar">?attr/colorOnSurface</item>
        <item name="android:windowBackground">@drawable/splash_background</item>

        <!-- These are the React default theme colors, if your theme is different, adjust accordingly -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorSecondary">@color/colorSecondary</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

AndroidManifest.xml

 <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:requestLegacyExternalStorage="true" 
      android:roundIcon="@mipmap/ic_launcher_round"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
    </application>

【问题讨论】:

  • 您想知道这是一种好的解决方法还是您必须创建活动?
  • 是的,如果我的解决方案有一些负面影响或者是不好的做法,我想得到一些反馈。就流程而言,我的解决方案可以正常工作并显示启动画面。
  • 如果它适合你然后使用它,但它不是很灵活,因为你似乎替换了整个应用程序的默认背景。您可以只替换主要活动的背景,但如果您只有一个活动,则没关系。
  • 只有一个建议,因为您已标记 react-native ,如果您想为 android 和 iOS 设备添加启动画面,请添加类似 SpashScreen.js 的内容并将其放入导航器的初始路由选项, android 启动画面仅适用于 android 设备。

标签: android react-native splash-screen


【解决方案1】:

常见错误

在大多数应用程序开发人员使用闪屏来展示品牌图标或图片几秒钟。这是大多数开发人员都遵循的常见做法。使用浪费用户时间的闪屏不是一个好主意。应该严格避免这种情况。

一般的做法也可能导致启动时出现空白页的问题。

正道

实现启动画面的正确方法略有不同。在新方法中,将初始屏幕的背景指定为 Activity 的主题背景。

空白页问题的根本原因是您的布局文件只有在应用程序完全初始化后才可见。

不要为启动活动创建布局文件。相反,将活动的主题背景指定为启动布局。

来源medium.com

【讨论】:

  • 你是对的,但是在你链接的指南中,他们还在 AndroidManifest 以及 Java 源文件中创建了一个单独的 SplashActivity。如果你可以把这一切都排除在外,但这样做有缺点吗?
  • 我不这么认为
【解决方案2】:

我会这样做:

第 1 步。

创建可绘制的启动画面:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">
    <item android:drawable="@color/white"/>
    <item android:drawable="@drawable/ic_app_icon"
        android:gravity="center"
        android:height="120dp"
        android:width="120dp"/>
</layer-list>

第 2 步。

为您的启动画面创建样式:

<style  name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi">shortEdges</item>
        <item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item>
        <item name="actionOverflowMenuStyle">@style/Widget.MaterialComponents.PopupMenu.Overflow</item>
        <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
        <item name="android:windowBackground">@drawable/drawable_splash_screen</item>
        <item name="android:navigationBarColor">#FFFFFF</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    <style  name="AppTheme.FullScreen"  parent="AppTheme">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    <style name="SplashTheme" parent="AppTheme.FullScreen">
        <item name="android:windowBackground">@drawable/drawable_splash_screen</item>
        <item name="android:navigationBarColor">#FFFFFF</item>
    </style>

第 3 步。

在你的活动中这样做:

@Override
protected void onCreate(Bundle _savedInstanceState) {
    super.onCreate(_savedInstanceState);
    setContentView(R.layout.activity_main);
    //Change window background from splash screen drawable to solid color.
    getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    //Show status bar
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

结束我变漂亮了,没有浪费时间的启动画面:

【讨论】:

    【解决方案3】:

    Google 团队已发布适用于 Android 12 及更低版本的新启动画面 Api。

    参考:

    https://developer.android.com/guide/topics/ui/splash-screen

    步骤:

    为启动画面设置主题以更改其外观

    您可以在 Activity 主题中指定以下属性来自定义应用的启动画面。如果您已有使用 android:windowBackground 等属性的旧式初始屏幕实现,请考虑为 Android 12 及更高版本提供备用资源文件。

    使用 windowSplashScreenBackground 用特定的单色填充背景:

    <item name="android:windowSplashScreenBackground">@color/...</item>
    

    使用 windowSplashScreenAnimatedIcon 替换起始窗口中心的图标。如果对象通过 AnimationDrawable 和 AnimatedVectorDrawable 可以动画和绘制,还需要设置 windowSplashScreenAnimationDuration 来播放动画,同时显示起始窗口。

    <item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
    

    使用 windowSplashScreenAnimationDuration 来表示闪屏图标动画的持续时间。设置此项不会对显示初始屏幕的实际时间产生任何影响,但您可以在使用 SplashScreenView#getIconAnimationDuration 自定义初始屏幕退出动画时检索它。有关详细信息,请参阅下一节中的将初始屏幕保留更长时间。

    <item name="android:windowSplashScreenAnimationDuration">1000</item>
    

    使用 windowSplashScreenIconBackgroundColor 在启动画面图标后面设置背景。如果窗口背景和图标之间没有足够的对比度,这很有用。

    <item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>
    

    (可选)您可以使用 windowSplashScreenBrandingImage 设置要在初始屏幕底部显示的图像。设计指南建议不要使用品牌形象。

    <item name="android:windowSplashScreenBrandingImage">@drawable/...</item>
    

    让启动画面在屏幕上停留更长时间

    一旦您的应用绘制第一帧,启动画面就会消失。如果您需要从本地磁盘异步加载应用内设置等少量数据,您可以使用 ViewTreeObserver.OnPreDrawListener 暂停应用以绘制其第一帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2021-12-26
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多