Android启动页白屏/黑屏问题解决

1. 前言

记得之前记录过这个问题怎么解决,但是在自己的这个博客中确实没有找到。所以还是继续记录一笔。为了更加直观的说明这个问题,这里我随意创建了一个应用,然后做一个录屏:

在这里插入图片描述
在上面的动态图片中,可以看到打开系统自带、自己创建应用均有启动的黑屏显现。但是自己在平时实际中使用App的过程中,却没有看见过这个显现,取而代之的是一个启动页面。这种效果更加友好,所以这里也来记录下怎么解决这个问题。

2. 解决

解决方式其实就是自定义主题样式。大致存在两种方式来解决这个问题,第一个是直接设置背景色,第二个是设置背景图片。

2.1 纯色背景

对于设置颜色,我们需要同时设置几个部分的颜色,分别包括最顶部往下的状态栏、ActionBar、主页的三个颜色。具体的对应关系如下:
在这里插入图片描述
注:上图来自Android如何设置顶部状态栏颜色(主题)

所以解决方案为隐藏ActionBar,并设置状态栏statusBarColor的颜色和windowBackground的颜色一致即可。那么可以为启动的Activity来设置主题,即:android:theme="@style/WelcomeTheme"。对于WelcomeTheme的主题,定义在themes.xml文件中:

<style name="WelcomeTheme" parent="Theme.AppCompat.NoActionBar">
    <!--设置背景颜色-->
    <item name="android:windowBackground">@color/full_screen</item>
    <!--设置没有ActionBar-->
    <item name="android:windowNoTitle">true</item>
    <!--设置顶部状态栏颜色-->
    <item name="android:statusBarColor" tools:targetApi="l">@color/full_screen</item>
</style>

对于full_screen定义为:

<color name="full_screen">#FF369046</color>

那么这样就可以实现一个直观上的全屏效果。如下:

在这里插入图片描述
那么对于启动页可以设置一个应用Logo,就只需要设置一个超时跳转即可。就不会给用户一种视觉上的白/黑屏效果。

但是,其实这并不是我们所希望的效果,因为我们希望在进入后的背景色、状态栏颜色都回归到正常的App的默认主题颜色,所以我们还需要在启动MainActivity的时候进行主题的重置。即:

扫描二维码关注公众号,回复: 13185978 查看本文章
public class MainActivity extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setTheme(R.style.Theme_PlayMusicDemo); //恢复原有的样式
        setContentView(R.layout.activity_main);
    }
}

最终效果:
在这里插入图片描述

2.2 设置背景图片

当然设置纯色背景可以实现效果,但是在实际的App中,都是设置一个本应用的Logo,也就是设置的是一张图片背景。直接设置图片即可:

<item name="android:windowBackground">@drawable/aaa</item>

但是,其实感觉QQ的启动应该是在背景设置为白色,进入后的Activity这个页面设置为Logo页面。因为我在测试中发现如果就考虑修改白屏/黑屏的部分,跳转的太快了,而实际上的App的停留时间在2-3秒钟。所以如果需要还需要自己去尝试看看该如何实现。

3. 最终方案

  • 将白屏/黑屏效果部分替换为纯色背景;
  • 将启动的Activity设置为欢迎的Logo,并启动一个超时Handler来启动主页。

对于第一个这里不再给出,对于超时的Handler来启动另一个Activity这里可以给出示例代码:

// 3秒钟后跳转
new Handler(new Handler.Callback() {
    
    
    @Override
    public boolean handleMessage(@NonNull Message message) {
    
    
        startActivity(new Intent(getApplicationContext(), XXXActivity.class));
        finish();
        return false;
    }
}).sendEmptyMessageDelayed(0, 3000);

Thanks

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/121003811