Android 12之启动画面Splash Screens(一) -- 适配
Android 12之启动画面Splash Screens(一) -- 适配
- 启动画面的工作流程
- 启动画面的元素
- 启动画面的主题相关属性
- 自定义启动画面的退出动画
- 迁移启动画面(自定义启动画面)
- 自定义启动画面的异常情况
- 自定义启动画面
- 不显示原启动界面(SplashActivity)
- 将原启动界面显示在SplashScreenView上
- 结束
从 Android 12 开始,在所有应用的冷启动和温启动(应用重启)期间,系统一律会显示默认启动画面。系统默认启动画面由应用的启动图标和主题的 windowBackground
构成。
在搭载 Android 12 或更高版本的设备上未适配启动画面Splash Screens,则体验效果会受到很大影响。
启动画面的工作流程
当用户启动应用而应用的进程未运行(冷启动)或 activity 尚未创建(温启动)时,会发生以下事件。(在热启动期间从不显示启动画面)
- 系统使用指定主题以及自定义的任何动画显示启动画面(包括应用图标、图标背景和窗口背景),实际就是在
DecorView
添加一个SplashScreenView
用以显示启动画面。 - 当应用准备就绪时,系统会关闭启动画面并显示应用的
ContentView
。
启动画面的元素
使用启动画面的元素需要注意以下几点:
应用图标可以是静态或带动画的(矢量)图标,默认为应用的启动图标。动画的时长建议不超过 1000毫秒。
Android示例入门套件 news_avd_02.xml:
可以为应用图标添加图标背景;图标背景为了过渡图标与窗口背景之间的颜色对比度。如果使用一个自适应图标,当该图标与窗口背景之间的对比度足够高时,就会显示其背景。
与自适应图标一样,前景的三分之一被遮盖。
窗口背景由不透明的单色组成。如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。
品牌图片尺寸应为 200×80 dp,带有图标背景的应用图标尺寸应为 240×240 dp(同时位于直径 160 dp 的圆圈内),图标背景的应用图标尺寸应为 288×288 dp(同时位于直径 192 dp 的圆圈内)。
品牌logo(200*80):
图标+图标背景+窗口背景+品牌logo的效果:
动画图标格式必须是动画形式的矢量可绘制对象 (AVD) XML。 尺寸:AVD 图标的大小必须是自适应图标大小的四倍,如下所示:
图标面积必须是 432 dp(即 108 dp 的 4 倍,108 dp 是无遮盖自适应图标的面积)。图片内部三分之二的区域在启动器图标上可见,并且必须是 288 dp(即 72 dp 的四倍,72 dp是自适应图标内部遮盖区域的面积)。 建议动画的时长不超过 1,000 毫秒。可以使用延迟启动,但不能超过 166毫秒。
启动画面的主题相关属性
windowSplashScreenBackground
属性单色填充背景:<item name="android:windowSplashScreenBackground">@android:color/holo_orange_light</item>
windowSplashScreenAnimatedIcon
替换默认的窗口中心的启动画面图标。如果该对象可通过AnimationDrawable
和AnimatedVectorDrawable
呈现动画效果和进行绘制,还需要设置windowSplashScreenAnimationDuration
以在显示起始窗口的同时播放动画。<item name="android:windowSplashScreenAnimatedIcon">@drawable/news_avd_v02</item>
windowSplashScreenAnimationDuration
指定启动画面图标动画的时长。设置后对实际启动画面的显示时间不会有影响,可以在自定义启动画面退出动画时使用SplashScreenView#getIconAnimationDuration
检索图标动画的时长。如需了解详情,请参阅让启动画面显示更长时间。<item name="android:windowSplashScreenAnimationDuration">500</item>
windowSplashScreenIconBackgroundColor
设置启动画面图标后面的背景。当窗口背景与图标之间的颜色对比度不够高时,起到颜色过渡的作用。<item name="android:windowSplashScreenIconBackgroundColor">@android:color/holo_purple</item>
windowSplashScreenBrandingImage
设置要显示在启动画面底部的品牌logo图片。<item name="android:windowSplashScreenBrandingImage">@drawable/alimama</item>
自定义启动画面的退出动画
通过 Activity.getSplashScreen()
自定义启动画面的退出动画:
getSplashScreen().setOnExitAnimationListener(splashScreenView -> {final ObjectAnimator slideUpAnimator = ObjectAnimator.ofFloat(splashScreenView,View.TRANSLATION_Y,0f,-splashScreenView.getHeight());slideUpAnimator.setInterpolator(new AnticipateInterpolator());slideUpAnimator.setDuration(200L);// 需要在动画结束后移除SplashScreenViewslideUpAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {splashScreenView.remove();}});slideUpAnimator.start();});
更多请参考自定义用于关闭启动画面的动画
迁移启动画面(自定义启动画面)
- 在
build.gradle
文件中,更改您的compileSdkVersion
,并在依赖项中添加SplashScreen
compat库。build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
- 创建一个父级为
Theme.SplashScreen
的主题,并将postSplashScreenTheme
的值设为Activity
应使用的主题,同时将windowSplashScreenAnimatedIcon
设为可绘制对象或带动画的可绘制对象。其他属性可视需要进行设置。<style name="Theme.Component.Start" parent="Theme.SplashScreen"><item name="android:windowSplashScreenAnimatedIcon">@drawable/news_avd_v02</item><item name="android:windowSplashScreenAnimationDuration">200</item><item name="android:windowSplashScreenBackground">@android:color/holo_orange_light</item><item name="android:windowSplashScreenIconBackgroundColor">@android:color/holo_purple</item><item name="android:windowSplashScreenBrandingImage">@drawable/ic_logo</item><!-- 必须 --><item name="postSplashScreenTheme">@style/Theme.Component</item></style>
如果要在图标下添加背景颜色,您可以使用
Theme.SplashScreen.IconBackground
主题及设置windowSplashScreenIconBackground
属性。 - 在清单中,将启动 activity 的主题替换为您在上一步创建的主题。
<manifest> <application android:theme="@style/Theme.App.Start"><!-- or --><activity android:theme="@style/Theme.App.Start"> ...
- 在启动 activity 中,先调用
installSplashScreen
,然后再调用super.onCreate()
。public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {//处理splash screen过渡SplashScreen splashScreen = SplashScreen.installSplashScreen(this);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} }
installSplashScreen
会返回启动画面对象,您可以根据需要使用该对象自定义动画,或让启动画面在屏幕上显示更长时间。Google建议不超过1000毫秒。
*必须按以上步骤执行,否则出现异常现象。
自定义启动画面的异常情况
- 在自定义SplashScreen画面后,启动应用时程序奔溃且出现下面异常时
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
此异常说明
SplashScreen.installSplashScreen(this)
未执行或未在super.onCreate()
前执行。 - 在自定义SplashScreen画面后,启动应用,启动画面显示后出现Activity界面的ActionBar挡住UI内容界面的控件,ActionBar操作栏异常情况如下图示:
出现上面界面异常情况说明未使用父级为Theme.SplashScreen
的主题。
自定义启动画面
如果想保留原启动画面Activity
(SplashActivity
),原逻辑保持SplashActivity
为主入口,在启动画面结束后显示SplashActivity
的内容。Google建议完全移除自定义启动画面 Activity
。
不显示原启动界面(SplashActivity)
若旧版本中定义了SplashActivity
类似的过渡Activity
,可调用SplashScreen.setKeepOnScreenCondition
来阻塞SplashScreen的执行达到持续显示的效果,再通过startActivity
过渡到主显示Activity
界面。维持SplashScreen启动界面再finish
是为了避免出现不好的跳转体验。
public class SplashActivity extends Activity {@Overrideprotected 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原理。
Android 12之启动画面Splash Screens(一) -- 适配相关推荐
- android os开机画面,Android简单实现启动画面的方法
本文实例讲述了Android简单实现启动画面的方法.分享给大家供大家参考,具体如下: 核心代码: package com.demo.app; import android.app.Activity; ...
- Android 12 adb 串口指令设置耳机音量适配
1.突然接到测试部一个需求 耳机录音在Android 12 直接运行崩溃,后面抓取日志一看是执行shell指令出现问题,看着日志我也没有特别清晰的思路 2.跳坑 于是我拿了之前另外一台Android ...
- Android -- 程序启动画面 Splash
很多应用都会有一个启动界面.欢迎画面慢慢隐现,然后慢慢消隐. 我的方式是使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一 ...
- Android 12 SplashScreen(闪屏页)适配
牢骚(废话) 谷歌真是吃饱了撑的,搞这搞那,Android12新出了一个强制闪屏页,效果就跟小米的闪屏页广告一样,只不过谷歌的是强制的,小米是可选的.不过谷歌再怎么搞,你还是要适配啊,难受. 正题 所 ...
- Android平台 Target API level 升级到 31,在Android 12上启动黑屏卡死
项目的SDK要升级,要把Target API level调整31.项目使用的是Unity2017.4.x,接完SDK后打完APP包装到手机上,启动直接黑屏.看Log,也没定位到具体的原因.然后网上搜索 ...
- Android 12 新APP启动画面(SplashScreen API)简介源码分析
以往的启动画面 默认情况下刚启动APP时会显示一会白色背景 如果把这个启动背景设置为null,则一闪而过的白色会变成黑色 如果把启动Activity设置为背景透明[< item name=&qu ...
- Android启动画面实现
在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源. Android要实现启动画面可以这样做: 这是splash.xml布局文件的代码[code]<LinearLayout ...
- android uber启动动画,模仿Uber的启动画面(上)
启动画面(Splash Screen)--不但给开发者们提供了一个尽情发挥.创建有趣动画的机会,也填补了App启动时从终端慢吞吞地下载数据的时间.启动画面(动态的)对于App至关重要:它可以让用户不失 ...
- Android 12上焕然一新的小组件:美观、便捷和实用
Google IO 2021上重磅介绍的Android 12,号称历代设计变化最大的版本.其全新的Material You设计语言.流畅的动画特效再到焕然一新的小组件,都令人印象深刻.本文将聚焦小组件 ...
- 从SplashScreen深度探讨App启动画面的前世今生
/ 今日科技快讯 / 近日,特斯拉公布了2021年第四季度以及全年汽车销售和交付数据.数据表示,特斯拉2021年第四季度交付了30.86万辆电动汽车,打破了之前的单季度纪录.就全年而言,特斯拉 ...
最新文章
- centos使用yum快速安装java的方法
- 干货丨一份不可多得的深度学习技巧指南
- NOIP2011聪明的质监员题解
- 蚂蚁金服CTO程立:从Fintech到Techfin,未来十年有九大重要挑
- 8.5-7 mkfs、dumpe2fs、resize2fs
- 如何避免Puppeteer被前端JS检测
- mysql配置文件注解
- java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
- 洛谷——P1017 进制转换
- 上海交大计算机专硕学费2018,2018年上海交通大学博士研究生学费与相关奖助政策...
- 2018年面试题大全
- windows11(win10大部分通用)系统C盘清理 | 深度优化
- 如何在虚拟机上写c语言程序吗,c语言初级(一)——如何在虚拟机里写代码
- 一键logo生成器_如何做海报?公众号封面图?logo?词云?试试这几个设计网站,用过的都说好!...
- 基于Android手机酒店客房预订系统
- java 504错误怎么解决_前端报504错误如何定位
- 陈莉君linux操作系统,Linux操作系统原理与应用(陈莉君)学习笔记.pdf
- 医院排队叫号系统(JAVA版)
- 20201217-IP报文解析
- 2020年医疗影像行业软镜专题研究报告
热门文章
- 支持向量回归(Support Vector Regression)
- Linux make 报错 pkg-config:not found
- Word生成目录后,二级,三级目录页码处与一级目录不齐
- 网络安全系列-二十五: PCAP文件格式详解及读取PCAP文件源码示例
- SG90舵机驱动,有代码
- 使用daemontools监控zookeeper,storm等进程
- p6spy监测mysql_Spring使用p6spy监控sql
- dog log 算子_log算子和dog算子
- arcgis中python计算面积的表达式_ArcGIS字段计算器中的python函数
- ArcGis中计算栅格数据指定区域的面积