Android -- 启动页面背景图片配置(splash)

作者在做App时制作启动页面踩了不少坑,记录了相关过程。介绍了启动优化和.9图片制作的基础知识,讲述设置.9图片为背景图时屏幕变形的解决办法及优化操作,还指出.9图片虽能解决部分拉伸变形问题,但适配不同分辨率仍需制作不同图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:opLW
好久没写博客了,6月份结束了期末考试,又进入了忙碌而充实的秋招备战阶段。自从之前用了幕布来制作脑图,现在一发不可收拾,学点什么都要用幕布记起来?,等秋招结束了整理分享出来。
最近在做一个App,之前了解了App启动优化的一些知识,但只是简单的将背景设置为透明,这次决定自己制作一个启动页面,这不踩了不少坑,这里记录一下。

江湖规矩先上图

在这里插入图片描述

如上图为最终效果,由于没有美工MM帮忙切图,所以只有**画质?。

基础知识
  • 需要先了解启动优化的相关知识 网上关于启动优化的文章实在是太多了,这里就不分析了,不了解的同学自行谷歌。
  • 需要知道.9格式图片的制作 这里还是不提,可以自行谷歌。
如何制作呢?
  • 设置.9图片为windowBackground之后屏幕严重变形。 在刚接触启动优化时,了解到可以通过
    <item name="android:windowBackground">@drawable/bg_welcome</item>
    将.9格式的图片设置为启动页面的背景图,于是满心欢喜的就做了一张.9格式的图片,并将按上述要 求添加到App的style中,结果如下:
    在这里插入图片描述
    很是尴尬?屏幕的显示内容严重变形。

  • 解决办法 谷歌了一圈找到了解决办法

    // style.xml文件
    <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>
     </style>
     ==1== //创建一个新的SplashTheme继承自AppTheme
     <style name="SplashTheme" parent="AppTheme">
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="colorAccent">@color/colorAccent</item>
         <item name="android:windowBackground">@drawable/bg_welcome</item>
     </style>
    // AndroidManifest.xml文件
     <application
         //......
         android:theme="@style/AppTheme">
         <activity
             //...... 
     ==2==   android:theme="@style/SplashTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
         <activity
             android:name=".ui.LoginActivity"
             android:label="@string/app_name" />
         <activity
             android:name=".ui.DetailListActivity" />
     </application>
    // MainActivity.kt文件
     override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
    ==3== setTheme(R.style.AppTheme_NoActionBar)
          setContentView(R.layout.activity_main)
     }
    
    • 1 创建一个新的SplashTheme继承自AppTheme
    • 2 对于App启动后打开的第一个Activity,我们将它的theme设置为含有.9图片的SplashTheme
    • 前两步设置完之后,打开App会最先看到我们的.9图片。但是MainActivity的背景图片会一直保持着,而我们希望的是进入操作页面之后.9图片消失,所以就有了第三步
    • 3MainActivity.onCreate()方法内部将theme重新设置为没有背景图片的theme记住setTheme方法应该在setContentView方法之前调用,因为setContentView会确定好背景。
  • 优化操作

    • 如下图。制作.9图片时,将核心要显示的内容置于图片的中心,而四周使用透明的背景。在这里插入图片描述
      再配合shape制作一张layer-list,具体代码如下
      <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item>
          <shape android:shape="rectangle">
              <solid
                  android:color="#fff"/>
          </shape>
      </item>
      <item android:gravity="center">
          <nine-patch
              android:src="@drawable/bg_welcome"
              android:tileMode="disabled" />
      </item>
      </layer-list>
      
      最后将上面这个文件设为SplashThemewindowBackground即可达到开头的效果。
  • 开头效果对应的.9图片
    在这里插入图片描述
    在适配不同分辨率时,绿色部分为可以拉伸的部分,而其他部分不会受影响。

新的认知
  • 可能大部分人跟我一样认为.9图片很神奇,可以适配不同分辨率,其实不然。(真正可以随意拉伸,分辨率不受影响的是.svg图片)。那么.9图片有什么用呢????

  • 记住一点.9格式的图片相比于普通的图片的优点,就是它指明了在需要大规模拉伸的时候,被拉动变形的部分,某种程度上解决了拉伸带来的图片严重变形的问题。(注意这里对变形的定义是:图片要显示的部分发生比率上的变化,在上面图片中来说就是人物的腿部被拉长)

  • 但是当把一张分辨率很低的.9图片置于分辨率很高的机型上时,依然会导致图片模糊,只是不会导致图片变形。所以即使是.9图片,为了适配不同分辨率的机型,依然需要制作不同分辨率的.9图片。

万水千山总是情,麻烦手下别留情。
如若讲得有不妥,文末留言告知我,
如若觉得还可以,收藏点赞要一起。

opLW原创七言律诗,转载请注明出处

### Android 应用启动页背景短暂变形解决方案 #### 使用自定义主题避免白屏或黑屏现象 为了防止应用程序在启动过程中出现白屏或黑屏的现象,可以配置 `styles.xml` 文件中的主题属性。通过指定窗口背景图像作为启动画面的一部分,能够有效减少视觉上的突兀变化。 ```xml <style name="AppStartLoad" parent="android:Theme.NoTitleBar.Fullscreen"> <item name="android:windowBackground">@drawable/app_launcher_layout</item> <item name="android:windowIsTranslucent">true</item> </style> ``` 此段代码设置了全屏无标题栏的主题,并指定了一个可绘制资源作为窗口背景[^1]。这有助于确保应用启动瞬间即显示预期的设计效果而不是空白界面。 #### 设置透明度处理过渡动画 为了让用户体验更加流畅,在设置启动页时还可以考虑加入透明度参数: ```xml <item name="android:windowIsTranslucent">true</item> ``` 上述 XML 片段使得整个活动处于半透明状态,从而实现更平滑的画面切换体验。 #### 配置 Splash 屏幕逻辑 对于需要延时加载主页面的应用程序来说,可以在 `onCreate()` 方法内安排计时器或者其他异步操作完成必要的准备工作后再跳转至主页: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 延迟三秒钟后自动关闭SplashActivity并打开MainActivity new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intent); finish(); } }, 3000); // 单位毫秒 } ``` 这段 Java 代码展示了如何利用 `Handler` 类配合 `Runnable` 接口来实现在特定时间间隔之后执行某项任务的功能[^5]。 #### 图片适配优化 针对不同分辨率设备上可能出现的图片拉伸问题,建议采用矢量图形(Vector Drawable)代替传统 PNG 或 JPEG 格式的静态素材。如果确实需要用到位图,则应根据不同屏幕密度准备相应版本的图片文件放置于对应的 drawable-xxxdpi 文件夹下[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值