Android 12 启动画面-SplashScreen(上)

简介: 🔥 Android 12 新功能-启动画面 Android 12 添加了 SplashScreen API ,它可为所有应用启用新的应用启动动画。应用可以通过多种方式来定制启动画面,以彰显其独有的品牌个性。 这包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。 默认情况下,使用启动图标。

🔥 Android 12 新功能-启动画面


       Android 12 添加了 SplashScreen API ,它可为所有应用启用新的应用启动动画。应用可以通过多种方式来定制启动画面,以彰显其独有的品牌个性。


       这包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。


       默认情况下,使用启动图标。

微信图片_20220524121519.gif


🔥 启动画面的工作原理


       出现的场景:


  • 开机第一次启动应用


  • 用户杀死进程


  • 系统回收了应用内存(进程被杀死)。


       就是应用程序的进程不存在或被杀死,用户再次打开应用就会启动这个启动画面。


       启动画面加载结束后,显示我们的Activity(MAIN)界面。


       关于应用启动模式可以参考:Android 性能优化之启动优化


🔥 动画的元素和机制


       它们由窗口背景(4)、应用图标(1)(静态动态两种)、图标背景(3) 还有底部的图片(谷歌不推荐使用) 组成


微信图片_20220524121648.png


关于这些元素,请注意以下几点:


  • 中心图标 (1) :


  • 矢量可绘制对象;
  • 静态或动画形式;
  • 时间不超过 1000 毫秒;
  • 默认情况下,使用启动图标。
  • 内容需要保留2/3的内边距,否则图标会被裁剪掉。


  • 图标背景 (2)(可选) :


  • 中心图标透明背景:有效;
  • 中心图标非透明背景:有效,被图标背景遮挡效果无法看出(等同失效,还不如不设置)。


  • 与自适应图标一样,前景的三分之一被屏蔽(3)。


  • 窗口背景(4):由不透明的单色组成。


启动画面动画机制由进入动画和退出动画组成:


  • 进入动画由系统视图到启动画面组成。这由系统控制且不可自定义。


  • 退出动画由隐藏启动画面的动画运行组成,可以对其自定义。当动画完成时,需要手动移除启动画面。


🔥 自定义应用中的启动画面


💥 设置主题属性以更改其外观


🌀 设置启动画面背景颜色


       设置了淡紫色的背景图。


效果图:


微信图片_20220524121842.gif


代码如下:


    <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的内边距,否则图标会被裁剪掉。


       设置透明的静态图标


       图标如下:

微信图片_20220524121949.png


效果图:

微信图片_20220524122013.gif


代码如下:


    <style name="Theme.SccMall.SplashScreen">
        ...
        <item name="android:windowSplashScreenAnimatedIcon">drawable/iv_splash_animation1</item>
    </style>


 设置透明的动态图标


效果图:


微信图片_20220524122102.gif


代码如下


    <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>


🌀 设置图标的背景颜色


设置了紫色的图标背景颜色。如果图标背景不透明,会被遮挡效果无法看出。


效果图:


微信图片_20220524122208.png


代码如下:


    <style name="Theme.SccMall.SplashScreen">
        ...
        <item name="android:windowSplashScreenIconBackgroundColor">@color/splash_screen_icon_background</item>
    </style>


🌀 画面底部的图片(尺寸比例需要为 2.5:1,谷歌不推荐用)


效果图:


微信图片_20220524122251.png


  这里使用的尺寸是500:200。


代码如下:


    <style name="Theme.SccMall.SplashScreen">
        ...
        <item name="android:windowSplashScreenBrandingImage">@mipmap/iv_splash_screen_brandingimage</item>
    </style>


💥 最终效果


微信图片_20220524122333.png


效果:


微信图片_20220524122354.gif


代码如下:


    <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毫秒。如果你的广告页需要更多时间来加载数据,谷歌也提供了让其显示更长时间的方法,咱们一起来试试。


效果:

微信图片_20220524122519.gif


       跟上面对比明显发现时间延长了不少。


代码如下:


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;
        }
    }
}


💥 自定义用于关闭启动画面的动画


效果:


微信图片_20220524122605.gif


代码如下:


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();
        });
    }
}





相关文章
|
API Android开发 开发者
Android 12 适配指南——SplashScreen
Android 12(API 31)引入了 SplashScreen 相关API,用于开发Android应用的启动页。 SplashScreen相关API的引入影响在Andorid 12设备上运行的所有应用。若开发者未进行SplashScreen的适配工作,在应用冷启动和温启动时,可能会呈现两个启动页先后出现的情况(Android SplashScreen启动页 + Android应用自定义开发的启动页或引导页)。
1765 0
Android 12 适配指南——SplashScreen
|
API Android开发 开发者
Android 12上全新的应用启动画面,还不适配一下?(2)
Android 12上全新的应用启动画面,还不适配一下?(2)
Android 12上全新的应用启动画面,还不适配一下?(2)
|
XML 机器人 API
Android 12上全新的应用启动画面,还不适配一下?(1)
Android 12上全新的应用启动画面,还不适配一下?(1)
Android 12上全新的应用启动画面,还不适配一下?(1)
|
API 开发工具 Android开发
Android 12 启动画面-SplashScreen(下)
🔥 低版本适配 💥 SplashScreen 库 💥 使用 SplashScreen 库 🌀 导入库 🌀 设置主题 🌀 设置AndroidManifest.xml 🌀 Activity 中设置 SplashScreen 🌀 运行效果 🌀 小结 🔥 Android 5.0 - Android 12的兼容 💥 不进行处理,Android12 默认启动短暂的启动画面。 💥 在使用 SplashScreen 库的基础上修改 🌀 主题修改 🌀 Activity修改 运行效果
680 0
Android 12 启动画面-SplashScreen(下)
|
Android开发
Android 12:SplashScreen Compat源码解析
在上一篇文章Android 12 新功能:SplashScreen优化启动体验中我们介绍了Android 12上的一个新功能SplashScreen,同时提到了Google为了兼容低版本也提供了Androidx SplashScreen compat库,但是我们在使用的过程中发现这个库在Android 12和12以下版本表现并不一致,
116 0
|
API Android开发
Android 12新功能:使用SplashScreen优化启动体验
由于很多应用在启动时需要进行一些初始化事务,导致在启动应用时有一定的空白延迟,在之前我们一般的做法是通过替换 android:windowBackground 的自定义主题,使应用启动时及时显示一张默认图片来改善启动体验。 在Android 12中,官方添加了SplashScreen API,它可为所有应用启用新的应用启动界面。新的启动界面是瞬时显示的,所以就不必再自定义android:windowBackground 了。新启动页面的样式默认是正中显示应用图标,但是允许我们自定义,以便应用能够保持其独特的品牌。下面我们来看看如何使用它。
1071 0
|
Android开发 数据格式 XML
|
XML Android开发 数据格式
从零开始学Xamarin.Forms(三) Android 制作启动画面
原文: 从零开始学Xamarin.Forms(三) Android 制作启动画面     Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.
1287 0