不知道大家有没有发现,大厂的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.windowSplashScreenAnimatedIcon
和 R.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)