Android12新款闪屏十分惊艳,搜了搜其他作者得文章,并查阅了一些资料,目前可见得是文章很少。闪屏功能已经支持到android 5-android 12,不过12之前的版本效果不如12。这位作者写得很好,拿来试用了一下,发现了很多问题,在此做下总结。
Jetpack新成员SplashScreen:打造全新的App启动画面
先看效果
?
?使用方式
首先values里面创建好themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.AppSplashScreen" parent="Theme.SplashScreen">
<!--设置背景颜色-->
<item name="windowSplashScreenBackground">@color/colorPrimary</item>
<!--设置显示在屏幕中间的图标, 如果是通过 AnimationDrawable 和 AnimatedVectorDrawable 创建的对象,可呈现动画效果,则会在页面显示的时候,播放动画-->
<item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher_round</item>
<!--设置显示动画不可见时,使用 APP 的默认主题-->
<item name="postSplashScreenTheme">@style/Theme.AppTheme</item>
</style>
<!-- Base application theme. -->
<style name="Theme.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- 添加 APP 默认主题 -->
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
app/build.gradle? ?这里很重要 ,一定要改,不然会报错说找不到v31的文件,我感觉是因为这里还没完成适配的关系
android {
compileSdkVersion 31
...
}
改一下theme主题
<application
...
android:icon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.AppSplashScreen">
</application>
SplashScreenActivity
class SplashScreenActivity : ComponentActivity() {
private lateinit var binding: ActivitySplashScreenBinding
private var appReady = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ImmersionBar.with(this).init()
binding = ActivitySplashScreenBinding.inflate(layoutInflater)
setContentView(binding.root)
val splashScreen = installSplashScreen()
with(binding) {
// init view
}
/**
* 保持持启动画面可见,直到我们的应用准备好。因为可能从本地磁盘或者网络异步加载数据,
* 通过这个方法可以让应用暂停绘制第一帧。
*/
splashScreen.setKeepVisibleCondition { !appReady }
// 实现退出动画
splashScreen.setOnExitAnimationListener { splashScreenViewProvider ->
val splashScreenView = splashScreenViewProvider.view
val iconView = splashScreenViewProvider.iconView
val translationY = ObjectAnimator.ofFloat(
iconView,
View.TRANSLATION_Y,
iconView.translationY,
splashScreenView.height.toFloat()
)
translationY.interpolator = AnticipateInterpolator()
translationY.duration = 2000L
translationY.doOnEnd { splashScreenViewProvider.remove() }
translationY.start()
}
// 模拟从本地磁盘或者网络异步加载数据的耗时操作
Handler(Looper.getMainLooper())
.postDelayed({ appReady = true }, 3000)
}
}
activity_splash_screen
这里要特别注意 一定要在跟布局设置background,不然会出现这种问题
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimaryDark">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="主界面"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
?剩下的具体需要什么效果,延时多久等操作,请自行修改activity的代码
收工
|