Android启动页白屏&背景图拉伸的解决方案

Android启动页白屏&背景图拉伸的解决方案

1.前言

  • 新项目的闪屏页面用到一张大图,UI那边要求那张图片填充全屏,而且不能压缩或拉伸。
  • 然后百度了一把… 又折腾了好一会,最终参照中国联通app实现效果,在这里写个demo做一下记录,希望对你有用。

2.问题点

  • 一打开app启动页白屏问题

  • 图片拉伸问题

  • 最终效果图如下
    在这里插入图片描述
    是由3张图片和一个蓝色背景绘制的,全屏的是一个蓝色背景,上下都是同一张图(摆放不同),中间是一个小人图,底部是手机自带按钮的返回(沉浸式)

  • 下面是两张原图(缩小了一点显示)
    在这里插入图片描述
    在这里插入图片描述

3.代码及说明

直接上Activity类

public class SplashActivity extends AppCompatActivity implements Runnable {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        hideStatusBarNavigationBar();
        Intent intent = getIntent();
        if (!isTaskRoot()
                && intent != null
                && intent.hasCategory(Intent.CATEGORY_LAUNCHER)
                && intent.getAction() != null
                && intent.getAction().equals(Intent.ACTION_MAIN)) {
            finish();
            return;
        }
        new Handler().postDelayed(this, 4000);
    }

    @Override
    public void run() {
        String account = SharedPreferenceUtils.getInstance(this).getString(Constant.KEY_LOGIN_ACCOUNT);
        if (TextUtils.isEmpty(account)) {
            LoginActivity.start(this);
        } else {
            MainActivity.start(this);
        }
        finish();
    }


    //****状态栏、导航栏都透明****
    private void hideStatusBarNavigationBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
            window.setNavigationBarColor(Color.TRANSPARENT);
            return;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        }
    }

}
  • 主要是在OnCreate方法内调用下面方法将顶部和底部导航栏置为透明
 private void hideStatusBarNavigationBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
            window.setNavigationBarColor(Color.TRANSPARENT);
            return;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        }
    }

AndroidManifest.xml代码,设置theme属性

...
  <activity
            android:name=".module.splash.SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Splash_Page">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
  </activity>
...

style.xml属性

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>

    <style name="Splash_Page" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@drawable/splash_bitmap</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>

</resources>

注意下面属性,需要在v27下才生效,所以需要创建一个包名为values-v27的文件夹,里面再放一个style.xml文件

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

在res目录下创建文件夹drawable,文件夹内创建文件splash_bitmap.xml内容如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#6faceb" />
        </shape>
    </item>

	<!--item内部还可以指定距离上下左右的边距,具体根据自己需要-->
    <!--<item
        android:bottom="100dp"
        android:top="142dp">
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_splash" />
    </item>-->

    <item>
        <bitmap
            android:gravity="top|right"
            android:src="@drawable/ic_splash" />
    </item>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_splash_2" />
    </item>

    <item>
        <bitmap
            android:gravity="bottom|left"
            android:src="@drawable/ic_splash" />
    </item>

</layer-list>

好了,到此代码结束,是不是特别简单~

4.注意点

  • 无论图有多么的复杂,我们都需要把图给拆开(让UI切图),不能用整张图来做适配
  • 和布局XML不一样,图片没有太多的裁剪属性可以使用,过宽或过高的图片系统会自动裁剪,所以一些不想裁剪的元素需要单独做一张图摆放位置

要是对你有用帮我点个👍。
附上源码地址:github源码(平时的demo)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android启动白屏的问题通常是由几个可能的原因引起的。 首先,可能是由于启动页资源加载过多或加载时间过长。启动页一般是启动应用程序时的第一个页面,如果其中包含大量的片或其他资源文件,可能会导致加载时间过长,显示为白屏。为了解决这个问题,可以尝试优化资源加载的方式,比如减少资源文件的大小或数量,并尽量异步加载资源。 其次,可能是由于启动页逻辑处理过多。如果在启动页进行了过多的逻辑处理,比如网络请求、数据库读写等操作,会导致启动页一直停留在加载状态,最终显示为白屏。要解决这个问题,可以考虑将一些耗时操作移到后台线程进行,并在处理完成后再跳转到下一个页面。 另外,设备性能也可能是造成启动白屏的原因之一。如果设备内存不足或处理器性能较低,可能无法快速加载启动页的资源,导致白屏。对于这种情况,可以考虑对资源进行压缩或减少启动页的复杂度,以提高页面加载速度。 最后,还有可能是由于启动页的布局或主题样式设置问题。如果启动页的布局或主题样式存在错误或异常,可能导致页面无法正确显示,最终呈现为白屏。为了解决这个问题,可以检查启动页的布局文件、主题样式文件以及相关的资源引用是否正确,并确保它们能够正确加载和渲染。 综上所述,解决Android启动白屏的问题,需要注意资源加载、逻辑处理、设备性能以及布局样式等方面的因素,以确保页面能够正常加载和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值