android 启动页拉伸_Android:启动页--最佳实践

一、前言

Android 开发过程中启动页是必不可少的,但是我们经常会看到启动打开后是先白屏或者黑屏,然后才会显示出启动页的图片,本文会解析此现象的原因,以及给出解决方案

1.1 启动白屏或黑屏的原因

AndroidManifest.xml中的application标签中设置了theme,当设置的theme是Light类型时启动白屏,当设置theme是Dark类型时启动黑屏;

1.2 进一步分析

当系统启动一个app时,zygote进程会fork一个app子进程,进程创建后在启动activity时就会创建一个window,这个window会使用theme中设置的windowBackground来显示背景颜色或者图片,当使用Light或Dark时跟进代码就能看到默认设置的windowBackground就是白色和黑色。

###二、启动页--常规做法

2.1 创建Activity:SplashActivity

class SplashActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_splash)

Handler().postDelayed({

startActivity(Intent(this,MainActivity::class.java))

finish()

},3000)

}

}

复制代码

2.2 给启动页创建background:splash_background.xml

android:src="@drawable/splash_screen"/>

复制代码

下面重点说下bitmap的属性功能:

android:antialias

布尔值。启用或停用抗锯齿。

android:dither

布尔值。当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。

android:filter

布尔值。启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。

android:gravity

定义位图的重力。重力指示当位图小于容器时,可绘制对象在其容器中放置的位置。

必须是以下一个或多个(用 '|' 分隔)常量值:

说明

top

将对象放在其容器顶部,不改变其大小。

bottom

将对象放在其容器底部,不改变其大小。

left

将对象放在其容器左边缘,不改变其大小。

right

将对象放在其容器右边缘,不改变其大小。

center_vertical

将对象放在其容器的垂直中心,不改变其大小。

fill_vertical

按需要扩展对象的垂直大小,使其完全适应其容器。

center_horizontal

将对象放在其容器的水平中心,不改变其大小。

fill_horizontal

按需要扩展对象的水平大小,使其完全适应其容器。

center

将对象放在其容器的水平和垂直轴中心,不改变其大小。

fill

按需要扩展对象的垂直大小,使其完全适应其容器。这是默认值。

clip_vertical

可设置为让子元素的上边缘和/或下边缘裁剪至其容器边界的附加选项。裁剪基于垂直重力:顶部重力裁剪上边缘,底部重力裁剪下边缘,任一重力不会同时裁剪两边。

clip_horizontal

可设置为让子元素的左边和/或右边裁剪至其容器边界的附加选项。裁剪基于水平重力:左边重力裁剪右边缘,右边重力裁剪左边缘,任一重力不会同时裁剪两边。

android:mipMap

布尔值。启用或停用 mipmap 提示。如需了解详细信息,请参阅 setHasMipMap()。默认值为 false。

android:tileMode

定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略。

必须是以下常量值之一:

说明

disabled

不平铺位图。这是默认值。

clamp

当着色器绘制范围超出其原边界时复制边缘颜色

repeat

水平和垂直重复着色器的图像。

mirror

水平和垂直重复着色器的图像,交替镜像图像以使相邻图像始终相接。

2.3 给启动页创建style:SplashTheme

true

true

@drawable/splash_background

复制代码

2.4 在AndroidManifest.xml中给SplashActivity设置style

android:theme="@style/SplashTheme">

复制代码

通过上面的4步设置就能够解决打开app白屏或黑屏的问题了。

三、最佳实践

3.1 场景1:只有屏幕中间有一张图片或者是图片+文字

通过上面的方式就能实现,注意bitmap使用gravity为center让图片和文字居中显示

3.2 场景2:屏幕中部和底部都有图片或者文字

这种上下布局的,例如微博,可以把图片切成上下两个,或者切割图片上下左右使图片整体能够居中显示

方式一:将图片切成屏幕中央显示的图片和底部图片

splash_background.xml中就需要换种写法了

android:src="@drawable/splash_center"/>

android:src="@drawable/splash_bottom"/>

复制代码

当手机底部有虚拟导航栏时,底部图片会被遮挡,使导航栏透明即可:

class SplashActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_splash)

Handler().postDelayed({

startActivity(Intent(this,MainActivity::class.java))

finish()

},3000)

}

}

复制代码

这句**window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)**是关键

方式二:将图片设置成background而不是windowBackground

style设置:

true

true

@android:color/white

@drawable/splash_background

复制代码

用background来设置背景图片

splash_background.xml设置:

android:src="@drawable/splash_screen"/>

复制代码

利用bitmap的gravity属性,用clip_vertical|clip_horizontal来裁剪图片

注意:利用第二种方式时不能使用window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION),这个会导致图片被拉伸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值