让代码更简单

Android12开屏图实现秒开应用

重要:本文最后更新于2022-11-08 19:24:58,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

不知道大家有没有发现,大厂的APP启动都非常快,而且启动APP会展示APP的logo。自己写的APP展现就非常慢,启动的时候总是会卡顿一下,或者是有一瞬间白屏/黑屏。在安卓12中,谷歌出手对安卓启动进行了优化,简单来说就是在安卓APP启动之前(应用进程还未创建),你点击APP图标后立即显示一张由你的应用logo图组成的图片。

虽然安卓12支持使用开屏图,但是安卓12以下的设备就不适配显然有点不现实,于是这里就要提到大家提供的 splashscreen 框架了,使用它,你可以在低版本安卓上实现安卓12一样的开屏效果。

先看看安卓12的开屏图展现方式。

首先构建应用的api级别要大于等于安卓12,否则Android Studio可能不会让你使用该代码

复制
compileSdkVersion 31

然后在drawable目录下创建一个背景图,如下

复制
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white"/>
    <item android:drawable="@mipmap/logo" android:gravity="center"/>
</layer-list>

在style.xml中新增一个你的主题

复制
<style name="TSplashScreen">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowSplashScreenBackground">@drawable/splash</item>
</style>

在清单配置中使用主题

复制
android:theme="@style/SplashScreen"

在你的启动页的代码中使用它

复制
contentview=findViewById(android.R.id.content);
contentview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (isready) {
contentview.getViewTreeObserver().removeOnPreDrawListener(this);
}
return isready;
}
});

上面的内容看看就得了,除了安卓12有效果外,其它机器都不能用。下面看看Google在AndroidX中提供的向下兼容的SplashScreen库。

API 31 中引入的 SplashScreen API 的兼容类。

在 API 31+ (Android 12+) 上,此类调用平台方法。

在 API 31 之前,平台行为被复制,但启动屏幕上的动画矢量可绘制支持除外。

要使用该类,需要将启动Activity的主题设置为 R.style.Theme_SplashScreen 为其父级,并且需要设置 R.attr.windowSplashScreenAnimatedIconR.attr.postSplashScreenTheme 属性。

也就是说这个库是用来向下兼容,需要注意一下内容:

  • 启动画面的中心图标动画(失效)
  • Activity的主题必须以 R.style.Theme_SplashScreen 为父级
  • 从 API 23 开始兼容所有新 Splash Screen API,图标背景除外。

开始使用

复制
android {
compileSdkVersion 31 
}

dependencies {
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
}

设置主题

复制
<style name="Theme.Other">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
...
</style>
<style name="SplashScreen" parent="Theme.SplashScreen">
<!-- 向下兼容。 -->
<item name="windowSplashScreenBackground">@color/splash_screen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/splash</item>
<item name="postSplashScreenTheme">@style/Theme.Other</item>
</style>

需要注意他们前面都没有 android:。

  • windowSplashScreenBackground:启动画面背景颜色。
  • windowSplashScreenAnimatedIcon:启动画面中心的图标。
  • postSplashScreenTheme:指定成你的App原来的主题。这样,当SplashScreen结束时,你的主题就能够被复原,从而不会影响到你的App主题

同样在AndroidManifest中使用

复制
android:theme="@style/SplashScreen">

启动页面代码中使用

复制
//初始化操作(必须放在setContentView()之前)
splashScreen=SplashScreen.installSplashScreen(this);

然后关心两个监听

复制
//是否需要保持闪屏图,返回true保持,false不保持
splashScreen.setKeepOnScreenCondition(new SplashScreen.KeepOnScreenCondition() {
@Override
public boolean shouldKeepOnScreen() {

return false;
}
});
//闪屏图退出
splashScreen.setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
@Override
public void onSplashScreenExit(@NonNull SplashScreenViewProvider splashScreenViewProvider) {

//.....
}
});

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐