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

  • 1.前言
  • 2.问题点
  • 3.代码及说明
  • 4.注意点

1.前言

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

2.问题点

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

  • 图片拉伸问题

  • 最终效果图如下

    是由3张图片和一个蓝色背景绘制的,全屏的是一个蓝色背景,上下都是同一张图(摆放不同),中间是一个小人图,底部是手机自带按钮的返回(沉浸式)

  • 下面是两张原图(缩小了一点显示)

3.代码及说明

直接上Activity类

public class SplashActivity extends AppCompatActivity implements Runnable {@Overrideprotected 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);}@Overridepublic 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属性

...<activityandroid: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内部还可以指定距离上下左右的边距,具体根据自己需要--><!--<itemandroid:bottom="100dp"android:top="142dp"><bitmapandroid:gravity="center"android:src="@drawable/ic_splash" /></item>--><item><bitmapandroid:gravity="top|right"android:src="@drawable/ic_splash" /></item><item><bitmapandroid:gravity="center"android:src="@drawable/ic_splash_2" /></item><item><bitmapandroid:gravity="bottom|left"android:src="@drawable/ic_splash" /></item></layer-list>

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

4.注意点

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

要是对你有用帮我点个

Android启动页白屏背景图拉伸的解决方案相关推荐

  1. android 加载图片 白屏,android启动页白屏和图片自适应问题

    android启动页白屏和图片自适应问题,自适应官方给的说法也只是做多套图去适配不同的分辨率,本文通过几个设置几行代码即可解决启动页短暂白屏和自适应问题. 网上的说法是通过启动页代码裁切图片或者在Im ...

  2. Android 启动页白屏 快速解决

    启动页有一个白屏 怎么解决 <style name="ThemeSplash" parent="Theme.AppCompat.Light.NoActionBar& ...

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

    文章目录 1. 前言 2. 解决 2.1 纯色背景 2.2 设置背景图片 3. 最终方案 1. 前言 记得之前记录过这个问题怎么解决,但是在自己的这个博客中确实没有找到.所以还是继续记录一笔.为了更加 ...

  4. android广告页白屏_Android 启动页白屏解决方案

    当我们打开app的时候是不是会有一瞬间的白屏然后再进入主活动,虽然这并不会造成什么不好的后果,但是感觉用户体验就不是很好.像网易云音乐等等,打开一瞬间就显示了他们的loge,无缝衔接,没有白屏,怎么 ...

  5. Android APP应用启动页白屏(StartingWindow)优化

    转自:https://www.cnblogs.com/whycxb/p/9312914.html 本人采用这种方法没有效果,启动图片出来第一帧,我应用的第一帧也出来了. 启动背景颜色没有调试出来,Th ...

  6. Android系统(121)---Android启动页黑屏及最优解决方案

    Android启动页黑屏及最优解决方案 前言 相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页.那么这个黑屏或者白屏 ...

  7. Android 系统(119)---Android启动页黑屏及最优解决方案

    Android启动页黑屏及最优解决方案 前言 相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页.那么这个黑屏或者白屏 ...

  8. android最优化启动画面,Android启动页黑屏及最优解决方案

    原标题:Android启动页黑屏及最优解决方案 作者:拉丁吴 链接:https://juejin.im/post/58ad90518ac2472a2ad9b684 前言 相信做过Android的朋友都 ...

  9. android广告页白屏_年度整理!2056页《大厂安卓岗面试真题解析合集》火爆全网...

    前言 2020年还有最后一个月就结束了,时间一眨眼就过去了.今年面试有没有被面试官虐呢,明年跳槽想跳去哪个大厂呢,这是个问题.说实话,今年我面试也被虐了,为了明年能找到一份心怡的工作,特地的从朋友那里 ...

最新文章

  1. POJ 1556 The Doors(计算几何+最短路)
  2. BZOJ-1406-密码箱-AHOI2007-数学
  3. JDBC(Java Data Base Connectivity,java数据库连接)
  4. href=#与javascript:void(0)的区别
  5. 经典算法题 -- 判断单链表是否成环及寻找成环节点
  6. c++ STL平常练习-1
  7. 浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)
  8. php 网页转pdf
  9. android 代码中使用dp,简单谈谈Android中SP与DP的区别
  10. 中国私有云发展调查报告(2018年)
  11. 呼叫中心中间件(mod_cti基于FreeSWITCH)-排队(ACD 话务分配)接口
  12. kali-top10-Nmap
  13. 使用C++ opencv将16位图像映射到8位
  14. 测站数据批量脚本下载
  15. 如何配置java的环境变量
  16. 互联网职场中95后女程序员有哪些兴趣爱好?
  17. 愤怒的老王,每天都想暗杀一个同事...
  18. 【1】深度学习之饮水思源:从感知机到深度网络
  19. PCA降维算法(内含PCA可视化迷你案例+PCA人脸识别降维案例+PCA逆转降噪案例)
  20. FindResource提取PE文件中的资源

热门文章

  1. python中print format的用法-python format用法详解
  2. 面试北京高思教育java开发考点总结---远程面试
  3. 寻找亚马逊测评师邮箱_美国及欧盟亚马逊产品外观专利查询步骤实操教程(已验证)...
  4. VS 程序打包成一个独立的exe - Enigma Virtual Box
  5. 啥是腾讯PBD ,看我给讲讲
  6. 棋牌服务器选择指南:不只是要看带宽
  7. FinalShell 连接出现 chanel is not opened解决方案记录
  8. initramfs两种方法恢复_微信会话记录删除了怎么恢复?最权威的方法在这
  9. 将html或者div转换为图片
  10. 【集成学习】boosting和bagging