当前位置: 首页 > 知识库问答 >
问题:

Android-防止启动时出现白色屏幕

施振海
2023-03-14

众所周知,许多Android应用程序在其第一个活动进入焦点之前会短暂地显示一个白色屏幕。在以下情况下会出现此问题:

>

在启动屏幕前显示默认预览窗口的Android应用程序。

设置android: windowDisablePreview="true"显然在这里不起作用。也不能将闪屏的父主题设置为主题。全息。NoActionBar如这里所述,因为[不幸地]我的闪屏使用了一个ActionBar

同时,不扩展应用程序类的应用程序在启动时不会显示白色屏幕。

问题是,理想情况下,应用程序对象中执行的初始化需要在显示第一个活动之前进行。因此,我的问题是,在不使用应用程序对象的情况下,如何在应用程序启动时执行这些初始化?我想可能使用线程服务

这是一个值得思考的有趣问题。我不能以通常的方式绕过它(通过设置NoActionBar主题),因为不幸的是,由于一些不相关的原因,我的Splash屏幕实际上有一个ActionBar

注:

我已提及以下问题:

>

  • 如何修复应用程序启动时的白色屏幕?

    Android启动屏幕一开始是白色的?

    闪屏前的白色屏幕

    Android应用程序启动时的白色背景

    为什么在Android系统中开始运行应用程序时会出现1秒钟的白色屏幕?

    参考资料:

    >

  • 模式-启动屏幕。

    品牌发布屏幕:Android的新亮点。

    飞溅屏幕的正确方式。

  • 共有3个答案

    宰父衡
    2023-03-14

    请复制和粘贴这两行在您的清单应用程序主题,即res/样式/AppTheme.

    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowIsTranslucent">true</item>
    
    郏志诚
    2023-03-14

    白色背景的问题是由于Android的冷启动,而应用程序加载到内存,它可以通过以下方式避免:

    public class OnboardingWithCenterAnimationActivity extends AppCompatActivity {
    public static final int STARTUP_DELAY = 300;
    public static final int ANIM_ITEM_DURATION = 1000;
    public static final int ITEM_DELAY = 300;
    
    private boolean animationStarted = false;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_onboarding_center);
    }
    
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    
        if (!hasFocus || animationStarted) {
            return;
        }
    
        animate();
    
        super.onWindowFocusChanged(hasFocus);
    }
    
    private void animate() {
        ImageView logoImageView = (ImageView) findViewById(R.id.img_logo);
        ViewGroup container = (ViewGroup) findViewById(R.id.container);
    
        ViewCompat.animate(logoImageView)
            .translationY(-250)
            .setStartDelay(STARTUP_DELAY)
            .setDuration(ANIM_ITEM_DURATION).setInterpolator(
                new DecelerateInterpolator(1.2f)).start();
    
        for (int i = 0; i < container.getChildCount(); i++) {
            View v = container.getChildAt(i);
            ViewPropertyAnimatorCompat viewAnimator;
    
            if (!(v instanceof Button)) {
                viewAnimator = ViewCompat.animate(v)
                        .translationY(50).alpha(1)
                        .setStartDelay((ITEM_DELAY * i) + 500)
                        .setDuration(1000);
            } else {
                viewAnimator = ViewCompat.animate(v)
                        .scaleY(1).scaleX(1)
                        .setStartDelay((ITEM_DELAY * i) + 500)
                        .setDuration(500);
            }
    
            viewAnimator.setInterpolator(new DecelerateInterpolator()).start();
        }
    }
    }
    

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?colorPrimary"
    android:orientation="vertical"
    >
    
    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="vertical"
        android:paddingTop="144dp"
        tools:ignore="HardcodedText"
        >
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="16dp"
            android:alpha="0"
            android:text="Hello world"         android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
            android:textColor="@android:color/white"
            android:textSize="22sp"
            tools:alpha="1"
            />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="8dp"
            android:alpha="0"
            android:gravity="center"
            android:text="This a nice text"
          android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse"
            android:textSize="20sp"
            tools:alpha="1"
            />
    
        <Button
            android:id="@+id/btn_choice1"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="48dp"
            android:scaleX="0"
            android:scaleY="0"
            android:text="A nice choice"
            android:theme="@style/Button"
            />
    
        <Button
            android:id="@+id/btn_choice2"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:scaleX="0"
            android:scaleY="0"
            android:text="Far better!"
            android:theme="@style/Button"
            />
    
    </LinearLayout>
    
    <ImageView
        android:id="@+id/img_logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/img_face"
        tools:visibility="gone"
        />
    </FrameLayout>
    

    img脸

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
            android:opacity="opaque">
    
    <item android:drawable="?colorPrimary"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/img_face"/>
    </item>
    

    将此主题添加到清单中的splashscreen中

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@null</item>
    </style>
    
    <style name="AppTheme.CenterAnimation">
        <item name="android:windowBackground">@drawable/ll_face_logo</item>
    </style>
    

    会产生这样的效果

    有关更多详细信息和更多解决方案,请查看此博客

    羊时铭
    2023-03-14

    请将此行添加到你的应用程序主题中

    <item name="android:windowDisablePreview">true</item>
    

    有关更多信息:https://developer.android.com/topic/performance/vitals/launch-time#themed

     类似资料:
    • 问题内容: 众所周知,许多Android应用在首次聚焦之前都会非常短暂地显示白屏。在以下情况下会出现此问题: 扩展全局类并在其中执行主要初始化的Android应用。该 对象总是在第一个对象之前创建(这可以在调试器中观察到),因此这很有意义。这是我的案件延误的原因。 在初始屏幕之前显示默认预览窗口的Android应用。 设置显然在这里不起作用。我也无法将初始屏幕的父主题设置为此处所述,因为[不幸的是

    • 我使用一个空活动为我的应用程序创建了一个启动屏幕,该活动在背景图像中保持可见3秒钟。通常,应用程序在背景图像变为可见之前以白色屏幕启动,然而,有些应用程序已经以“真实”的初始屏幕图像启动。如何实现这一点?

    • 我已经创建了一个初始屏幕,它一开始工作得很好,但之后,它会向我显示一个白色空白屏幕,而不是我的初始屏幕图像文件。我不知道为什么会发生这种情况。 我试图改变我的风格.xml父主题,但有些主题使我的应用程序崩溃,只有主题.AppCompat.Light.NoActionBar可以工作,并给我一个空白的白屏。 styles.xml 飞溅.java 屏幕序列、线程Hibernate时间和其他一切都正常工作

    • 当我启动我的应用程序时,我会看到一个白色的屏幕,几秒钟后就会出现闪屏。 我想知道我的应用程序的大小是否会影响它(它是17.7MB)。或者是因为我的测试机是旧的(HTC欲望高清),有点垃圾与太多的数据? 还是正常行为?或者问题在我的代码里,在下面... 舱单的一部分: 飞溅活动: 谢谢

    • 我有一个android应用程序,启动时会显示2秒钟的白色屏幕。我的其他应用程序不能做到这一点,但这一个可以做到。我还实现了一个splashscreen,希望它能解决这个问题。我应该增加闪屏睡眠时间吗?谢谢

    • 本文向大家介绍Vue防止白屏添加首屏动画的实例,包括了Vue防止白屏添加首屏动画的实例的使用技巧和注意事项,需要的朋友参考一下 单页应用有个无法避免的问题就是首屏加载慢,虽然可以通过gzip、路由懒加载、CDN、提高服务器带宽等手段,首屏加载速度仍然比传统多页应用慢一些。 为了提高用户体验,首屏添加loading动画很有必要,并且实现特别简单。 vue-cli3生成的项目中,打开index.htm