我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 12之启动画面Splash Screens(一) -- 适配

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 12之启动画面Splash Screens(一) -- 适配

Android 12之启动画面Splash Screens(一) -- 适配

从 Android 12 开始,在所有应用的冷启动和温启动(应用重启)期间,系统一律会显示默认启动画面。系统默认启动画面由应用的启动图标和主题的 windowBackground构成。
在这里插入图片描述
在搭载 Android 12 或更高版本的设备上未适配启动画面Splash Screens,则体验效果会受到很大影响。

启动画面的工作流程

当用户启动应用而应用的进程未运行(冷启动)或 activity 尚未创建(温启动)时,会发生以下事件。(在热启动期间从不显示启动画面)

  1. 系统使用指定主题以及自定义的任何动画显示启动画面(包括应用图标、图标背景和窗口背景),实际就是在DecorView添加一个SplashScreenView用以显示启动画面。
  2. 当应用准备就绪时,系统会关闭启动画面并显示应用的ContentView

启动画面的元素

使用启动画面的元素需要注意以下几点:

  1. 应用图标可以是静态或带动画的(矢量)图标,默认为应用的启动图标。动画的时长建议不超过 1000毫秒。
    Android示例入门套件 news_avd_02.xml
    在这里插入图片描述

  2. 可以为应用图标添加图标背景;图标背景为了过渡图标与窗口背景之间的颜色对比度。如果使用一个自适应图标,当该图标与窗口背景之间的对比度足够高时,就会显示其背景。

  3. 自适应图标一样,前景的三分之一被遮盖。

  4. 窗口背景由不透明的单色组成。如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。

  5. 品牌图片尺寸应为 200×80 dp,带有图标背景的应用图标尺寸应为 240×240 dp(同时位于直径 160 dp 的圆圈内),图标背景的应用图标尺寸应为 288×288 dp(同时位于直径 192 dp 的圆圈内)。
    品牌logo(200*80):
    在这里插入图片描述
    图标+图标背景+窗口背景+品牌logo的效果:
    在这里插入图片描述

  6. 动画图标格式必须是动画形式的矢量可绘制对象 (AVD) XML。 尺寸:AVD 图标的大小必须是自适应图标大小的四倍,如下所示:
    图标面积必须是 432 dp(即 108 dp 的 4 倍,108 dp 是无遮盖自适应图标的面积)。图片内部三分之二的区域在启动器图标上可见,并且必须是 288 dp(即 72 dp 的四倍,72 dp是自适应图标内部遮盖区域的面积)。 建议动画的时长不超过 1,000 毫秒。可以使用延迟启动,但不能超过 166毫秒。

启动画面的主题相关属性

  1. windowSplashScreenBackground属性单色填充背景:
         <item name="android:windowSplashScreenBackground">@android:color/holo_orange_lightitem>
  2. windowSplashScreenAnimatedIcon替换默认的窗口中心的启动画面图标。如果该对象可通过 AnimationDrawableAnimatedVectorDrawable呈现动画效果和进行绘制,还需要设置 windowSplashScreenAnimationDuration以在显示起始窗口的同时播放动画。
         <item name="android:windowSplashScreenAnimatedIcon">@drawable/news_avd_v02item>
  3. windowSplashScreenAnimationDuration指定启动画面图标动画的时长。设置后对实际启动画面的显示时间不会有影响,可以在自定义启动画面退出动画时使用 SplashScreenView#getIconAnimationDuration检索图标动画的时长。如需了解详情,请参阅让启动画面显示更长时间
         <item name="android:windowSplashScreenAnimationDuration">500item>
  4. windowSplashScreenIconBackgroundColor设置启动画面图标后面的背景。当窗口背景与图标之间的颜色对比度不够高时,起到颜色过渡的作用。
         <item name="android:windowSplashScreenIconBackgroundColor">@android:color/holo_purpleitem>
  5. windowSplashScreenBrandingImage设置要显示在启动画面底部的品牌logo图片。
        <item name="android:windowSplashScreenBrandingImage">@drawable/alimamaitem>

自定义启动画面的退出动画

通过 Activity.getSplashScreen()自定义启动画面的退出动画:

getSplashScreen().setOnExitAnimationListener(splashScreenView -> {            final ObjectAnimator slideUpAnimator = ObjectAnimator.ofFloat(                    splashScreenView,                    View.TRANSLATION_Y,                    0f,                    -splashScreenView.getHeight()            );            slideUpAnimator.setInterpolator(new AnticipateInterpolator());            slideUpAnimator.setDuration(200L);            // 需要在动画结束后移除SplashScreenView            slideUpAnimator.addListener(new AnimatorListenerAdapter() {                @Override                public void onAnimationEnd(Animator animation) {                    splashScreenView.remove();                }            });            slideUpAnimator.start();        });

更多请参考自定义用于关闭启动画面的动画

迁移启动画面(自定义启动画面)

  1. build.gradle文件中,更改您的 compileSdkVersion,并在依赖项中添加 SplashScreencompat库。
    build.gradleandroid {       compileSdkVersion 31       ... } dependencies {       ...      implementation 'androidx.core:core-splashscreen:1.0.0-beta02' } 
  2. 创建一个父级为 Theme.SplashScreen的主题,并将postSplashScreenTheme的值设为Activity应使用的主题,同时将 windowSplashScreenAnimatedIcon
    设为可绘制对象或带动画的可绘制对象。其他属性可视需要进行设置。
        <style name="Theme.Component.Start" parent="Theme.SplashScreen">        "android:windowSplashScreenAnimatedIcon">@drawable/news_avd_v02        "android:windowSplashScreenAnimationDuration">200        "android:windowSplashScreenBackground">@android:color/holo_orange_light        "android:windowSplashScreenIconBackgroundColor">@android:color/holo_purple        "android:windowSplashScreenBrandingImage">@drawable/ic_logo                "postSplashScreenTheme">@style/Theme.Component    style>
    如果要在图标下添加背景颜色,您可以使用 Theme.SplashScreen.IconBackground主题及设置 windowSplashScreenIconBackground属性。
  3. 在清单中,将启动 activity 的主题替换为您在上一步创建的主题。
    <manifest>       <application android:theme="@style/Theme.App.Start">            <activity android:theme="@style/Theme.App.Start">         ... 
  4. 在启动 activity 中,先调用 installSplashScreen,然后再调用 super.onCreate()
    public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {         //处理splash screen过渡         SplashScreen splashScreen = SplashScreen.installSplashScreen(this);         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);    } }

installSplashScreen会返回启动画面对象,您可以根据需要使用该对象自定义动画,或让启动画面在屏幕上显示更长时间。Google建议不超过1000毫秒。
在这里插入图片描述

*必须按以上步骤执行,否则出现异常现象。

自定义启动画面的异常情况

  1. 在自定义SplashScreen画面后,启动应用时程序奔溃且出现下面异常时

    Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

    此异常说明 SplashScreen.installSplashScreen(this)未执行或未在 super.onCreate()前执行。
  2. 在自定义SplashScreen画面后,启动应用,启动画面显示后出现Activity界面的ActionBar挡住UI内容界面的控件,ActionBar操作栏异常情况如下图示:
    在这里插入图片描述
    出现上面界面异常情况说明未使用父级为 Theme.SplashScreen的主题。

自定义启动画面

如果想保留原启动画面ActivitySplashActivity),原逻辑保持SplashActivity为主入口,在启动画面结束后显示SplashActivity的内容。Google建议完全移除自定义启动画面 Activity

不显示原启动界面(SplashActivity)

若旧版本中定义了SplashActivity类似的过渡Activity,可调用SplashScreen.setKeepOnScreenCondition来阻塞SplashScreen的执行达到持续显示的效果,再通过startActivity过渡到主显示Activity界面。维持SplashScreen启动界面再finish是为了避免出现不好的跳转体验。

  public class SplashActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {       SplashScreen splashScreen = SplashScreen.installSplashScreen(this);       super.onCreate(savedInstanceState);       // //一直停留在SplashScreen启动界面       splashScreen.setKeepOnScreenCondition(() -> true );       startActivity(new Intent(this, MainActivity.class));       finish();    }  ...  

将原启动界面显示在SplashScreenView上

SplashScreenView就是DecorView的子View,用下面方式,可以将原SplashScreenView上移除,并添加自定义的启动布局。此方式依然会显示启动图标的启动画面,在画面结束后显示自定义布局,可以设置点击按钮移除 SplashScreenView.remove()移除启动画面,显示 Activity的内容,

        getSplashScreen().setOnExitAnimationListener(splashScreenView -> {            splashScreenView.removeAllViews();            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_splash, null, false);            splashScreenView.addView(view);            view.setOnClickListener(v -> splashScreenView.remove());        });

结束

更多内容请参考谷歌文档:启动画面Splash screens
Splash Screen的framework原理参考下篇文章:Android 12之启动画面Splash Screens(二) – framework原理

来源地址:https://blog.csdn.net/CJohn1994/article/details/125966787

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 12之启动画面Splash Screens(一) -- 适配

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录