🔥 Android 12 新功能-启动画面
Android 12 添加了 SplashScreen API ,它可为所有应用启用新的应用启动动画。应用可以通过多种方式来定制启动画面,以彰显其独有的品牌个性。
这包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。
默认情况下,使用启动图标。
🔥 启动画面的工作原理
出现的场景:
- 开机第一次启动应用
- 用户杀死进程
- 系统回收了应用内存(进程被杀死)。
就是应用程序的进程不存在或被杀死,用户再次打开应用就会启动这个启动画面。
启动画面加载结束后,显示我们的Activity(MAIN)界面。
关于应用启动模式可以参考:Android 性能优化之启动优化。
🔥 动画的元素和机制
它们由窗口背景(4)、应用图标(1)(静态动态两种)、图标背景(3) 还有底部的图片(谷歌不推荐使用) 组成:
关于这些元素,请注意以下几点:
- 中心图标 (1) :
- 矢量可绘制对象;
- 静态或动画形式;
- 时间不超过 1000 毫秒;
- 默认情况下,使用启动图标。
- 内容需要保留2/3的内边距,否则图标会被裁剪掉。
- 图标背景 (2)(可选) :
- 中心图标透明背景:有效;
- 中心图标非透明背景:有效,被图标背景遮挡效果无法看出(等同失效,还不如不设置)。
- 与自适应图标一样,前景的三分之一被屏蔽(3)。
- 窗口背景(4):由不透明的单色组成。
启动画面动画机制由进入动画和退出动画组成:
- 进入动画由系统视图到启动画面组成。这由系统控制且不可自定义。
- 退出动画由隐藏启动画面的动画运行组成,可以对其自定义。当动画完成时,需要手动移除启动画面。
🔥 自定义应用中的启动画面
💥 设置主题属性以更改其外观
🌀 设置启动画面背景颜色
设置了淡紫色的背景图。
效果图:
代码如下:
<style name="Theme.SccMall.SplashScreen"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowSplashScreenBackground">@color/splash_screen_background</item> </style>
AndroidManifest.xml设置主题:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.SccMall.SplashScreen"> </application>
🌀 设置中间显示的图标
中心图标大图,内容需要保留2/3的内边距,否则图标会被裁剪掉。
设置透明的静态图标
图标如下:
效果图:
代码如下:
<style name="Theme.SccMall.SplashScreen"> ... <item name="android:windowSplashScreenAnimatedIcon">drawable/iv_splash_animation1</item> </style>
设置透明的动态图标
效果图:
代码如下
<style name="Theme.SccMall.SplashScreen"> ... <item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_animate_icon</item> <item name="android:windowSplashScreenAnimationDuration">1000</item> </style>
splash_animate_icon.xml
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/iv_1" android:duration="250"/> <item android:drawable="@drawable/iv_2" android:duration="250"/> <item android:drawable="@drawable/iv_3" android:duration="250"/> <item android:drawable="@drawable/iv_4" android:duration="250"/> </animation-list>
🌀 设置图标的背景颜色
设置了紫色的图标背景颜色。如果图标背景不透明,会被遮挡效果无法看出。
效果图:
代码如下:
<style name="Theme.SccMall.SplashScreen"> ... <item name="android:windowSplashScreenIconBackgroundColor">@color/splash_screen_icon_background</item> </style>
🌀 画面底部的图片(尺寸比例需要为 2.5:1,谷歌不推荐用)
效果图:
这里使用的尺寸是500:200。
代码如下:
<style name="Theme.SccMall.SplashScreen"> ... <item name="android:windowSplashScreenBrandingImage">@mipmap/iv_splash_screen_brandingimage</item> </style>
💥 最终效果
效果:
代码如下:
<style name="Theme.SccMall.SplashScreen"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!-- 启动画面背景颜色 --> <item name="android:windowSplashScreenBackground">@color/splash_screen_background</item> <!-- 启动画面中间显示的图标,默认使用应用图标 --> <item name="android:windowSplashScreenAnimatedIcon">@drawable/iv_splash_animation1</item> <!-- 启动画面中间显示的图标的背景,如果图标背景不透明则无效 --> <item name="android:windowSplashScreenIconBackgroundColor">@color/splash_screen_icon_background</item> <!-- 启动画面启动画面底部的图片。 --> <item name="android:windowSplashScreenBrandingImage">@mipmap/iv_splash_screen_brandingimage</item> <!-- 启动画面在关闭之前显示的时长。最长时间为 1000 毫秒。 --> <item name="android:windowSplashScreenAnimationDuration">1000</item> </style>
💥 让其在屏幕上显示更长时间
启动画面最长1000毫秒。如果你的广告页需要更多时间来加载数据,谷歌也提供了让其显示更长时间的方法,咱们一起来试试。
效果:
跟上面对比明显发现时间延长了不少。
代码如下:
1.public class AdvertiseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... //延长启动画面显示时间 extendDisplayTime(); } //延长启动画面显示时间 private void extendDisplayTime() { MyViewModel myViewModel = new MyViewModel(getApplication()); // Set up an OnPreDrawListener to the root view. final View content = findViewById(android.R.id.content); content.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // 检查初始数据是否准备好。 if (myViewModel.isReady()) { // 取消挂起,内容准备好了。 content.getViewTreeObserver().removeOnPreDrawListener(this); return true; } else { // 挂起,内容未准备好。 return false; } //如果仅return false,则会产生一个永久显示SplashScreen的效果。 } }); } public class MyViewModel extends AndroidViewModel { public MyViewModel(Application application) { super(application); } private long startUptimeMillis = SystemClock.uptimeMillis(); public boolean isReady(){ return SystemClock.uptimeMillis()-startUptimeMillis>3000; } } }
💥 自定义用于关闭启动画面的动画
效果:
代码如下:
public class AdvertiseActivity extends AppCompatActivity { ActivityAdvertiseBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... //关闭动画 spplashScreenCloseAnimation(); } private void spplashScreenCloseAnimation(){ //添加一个回调,当启动画面为应用内容设置动画时调用。 getSplashScreen().setOnExitAnimationListener(splashScreenView -> { final ObjectAnimator slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.getHeight() ); slideUp.setInterpolator(new AnticipateInterpolator()); slideUp.setDuration(2000); // 在自定义动画结束时调用splashScreenView.remove(); slideUp.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { //移除启动画面 splashScreenView.remove(); } }); // 启动动画 slideUp.start(); }); } }