启动画面| Android 开发者
文章推薦指數: 80 %
从Android 12 开始,在搭载Android 12 或更高版本的设备上运行时,所有应用都将拥有启动动画。
这包括启动时的进入应用动作、显示应用图标的启动画面,以及 ...
平台
AndroidStudio
GooglePlay
Jetpack
Kotlin
文档
游戏
English
BahasaIndonesia
Español–AméricaLatina
Português–Brasil
TiếngViệt
中文–简体
中文–繁體
日本語
한국어
登录
文档
概览
指南
参考文档
示例
设计和质量
平台
AndroidStudio
GooglePlay
Jetpack
Kotlin
文档
概览
指南
参考文档
示例
设计和质量
游戏
应用基础知识
简介
构建首个应用
概览创建Android项目运行您的应用构建简单的界面启动另一个Activity
应用基础知识
应用资源
概览处理配置变更
本地化
本地化您的应用使用pseudolocale测试您的应用Unicode和国际化支持语言和语言区域解决方案复杂的XML资源
资源类型
概览动画颜色状态列表可绘制对象布局菜单字符串样式字体更多类型
应用清单文件
概览
重要提示:如果您之前已经在Android11或更低版本中实现自定义启动画面,则需要将您的应用迁移到SplashScreenAPI,确保它会在Android12及更高版本中正确显示。
如需了解相关说明,请参阅将现有的启动画面实现迁移到Android12。
从Android12开始,在搭载Android12或更高版本的设备上运行时,所有应用都将拥有启动动画。
这包括启动时的进入应用动作、显示应用图标的启动画面,以及向应用本身的过渡。
图1:启动画面示例
这种体验可让应用每次启动时都呈现标准设计元素,但它也可自定义,以便您的应用能够保持其独特的品牌形象。
除了使用SplashScreen平台API之外,您还可以使用封装SplashScreenAPI的SplashScreencompat库。
启动画面的工作原理
当用户启动应用而应用的进程未运行(冷启动)或activity尚未创建(温启动)时,会发生以下事件。
(在热启动期间从不显示启动画面。
)
系统使用主题以及您已定义的任何动画显示启动画面。
当应用准备就绪时,系统会关闭启动画面并显示应用。
启动画面的元素和机制
启动画面的元素由Android清单中的XML资源文件定义。
每个元素都有浅色模式和深色模式版本。
启动画面的可自定义元素包括应用图标、图标背景和窗口背景:
图2:启动画面的可自定义元素
关于这些元素,请注意以下几点:
1应用图标应该是矢量可绘制对象,它可以是静态或动画形式。
虽然动画的时长可以不受限制,但我们建议不超过1000毫秒。
默认情况下,使用启动器图标。
2可以选择添加图标背景;在图标与窗口背景之间需要更高的对比度时图标背景很有用。
如果您使用一个自适应图标,当该图标与窗口背景之间的对比度足够高时,就会显示其背景。
3与自适应图标一样,前景的三分之一被遮盖。
4窗口背景由不透明的单色组成。
如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。
启动画面尺寸
启动画面图标使用的规范与自适应图标相同,如下所示:
品牌图片:尺寸应为200×80dp。
带有图标背景的应用图标:尺寸应为240×240dp,并且位于直径160dp的圆圈内。
无图标背景的应用图标:尺寸应为288×288dp,并且位于直径192dp的圆圈内。
例如,如果图片的完整尺寸为300×300dp,则图标需要位于直径200dp的圆圈内。
圆圈以外的所有内容将不可见(被遮盖)。
图3:纯色背景和透明背景各自的启动画面图标尺寸
启动画面动画和启动序列
额外的延迟时间通常与在冷启动时启动应用有关。
向启动画面添加动画图标具有明显的美感,并提供更优质的体验,除此之外,还有额外的好处:用户研究表明,在观看动画时,用户感知到的启动时间会缩短。
启动画面动画会嵌入到以下启动序列组件中。
进入动画:由系统视图到启动画面组成。
这由系统控制且不可自定义。
启动画面:您可以对启动画面进行自定义,从而提供自己的徽标动画和品牌形象。
它必须满足本文档中所述的要求,才能正常运行。
退出动画:由隐藏启动画面的动画运行组成。
如果您要对其进行自定义,您将可以访问SplashScreenView及其图标,并且可以在它们之上运行任何动画(需要设置转换、不透明度和颜色)。
在这种情况下,当动画完成时,需要手动移除启动画面。
运行图标动画时,如果应用先前已准备就绪,应用启动功能可让您选择跳过相应序列。
应用会触发onResume()或者启动画面会自动超时,因此确保用户能够轻松跳过启动画面动画。
只有当从视觉角度来看应用稳定后,才应通过onResume()关闭启动画面,因此无需额外的旋转图标。
引入不完整的界面可能会给用户带来不快,并让用户感觉不可预知或不够完善。
启动画面动画要求
启动画面应符合以下规范:
设置不透明的单一窗口背景颜色。
SplashScreencompat库同时支持日间模式和夜间模式。
确保动画图标符合以下规范:
格式:必须是动画形式的矢量可绘制对象(AVD)XML。
尺寸:AVD图标的大小必须是自适应图标大小的四倍,如下所示:
图标面积必须是432dp(即108dp的4倍,108dp是无遮盖自适应图标的面积)。
图片内部三分之二的区域在启动器图标上可见,并且必须是288dp(即72dp的四倍,72dp是自适应图标内部遮盖区域的面积)。
时长:我们建议在手机上的时长不超过1,000毫秒。
您可以使用延迟启动,但不能超过166毫秒。
如果应用启动时间超过1000毫秒,请考虑使用循环动画。
确定合适的时间来关闭启动画面,这发生在应用绘制第一帧时。
您可以按照本文档中让启动画面在屏幕上显示更长时间部分的说明进一步自定义此设置。
启动画面资源
图4:AVD示例
下载我们的示例入门套件,该套件演示了如何创建动画、设置动画格式并将其导出到AVD。
动画的AdobeAfterEffects项目文件
最终导出的AVDXML文件
动画的GIF示例
下载这些文件,即表示您同意Google服务条款。
Google隐私权政策介绍了此服务如何处理数据。
自定义应用中的启动画面
默认情况下,SplashScreen使用主题的windowBackground(如果它是单色)和启动器图标。
启动画面的自定义通过向应用主题添加属性来完成。
您可以通过以下任一方式自定义应用的启动画面:
设置主题属性以更改其外观
让其在屏幕上显示更长时间
自定义用于关闭启动画面的动画
设置启动画面的主题以更改其外观
您可以在activity主题中指定以下属性来自定义应用的启动画面。
如果您已有使用android:windowBackground等属性的旧版启动画面实现,不妨考虑为Android12及更高版本提供替代资源文件。
使用windowSplashScreenBackground以特定的单色填充背景:
如果该对象可通过AnimationDrawable和AnimatedVectorDrawable呈现动画效果和进行绘制,那么您还需要设置windowSplashScreenAnimationDuration,以在显示起始窗口的同时播放动画。
设置该时长对显示启动画面的实际时间不会产生任何影响,但您可以在自定义启动画面退出动画时使用SplashScreenView#getIconAnimationDuration检索图标动画的时长。
如需了解详情,请参阅下一部分中的让启动画面显示更长时间。
当窗口背景与图标之间的对比度不够高时,这很有用。
设计准则建议不要使用品牌图片。
如果您需要从本地磁盘异步加载少量数据(如应用内设置),可以使用ViewTreeObserver.OnPreDrawListener让应用暂停绘制第一帧。
如果启动activity在绘制之前完成(例如,不设置内容视图并在onResume之前完成),则无需预绘制监听器。
Kotlin
//Createaneweventfortheactivity.
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
//Setthelayoutforthecontentview.
setContentView(R.layout.main_activity)
//SetupanOnPreDrawListenertotherootview.
valcontent:View=findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(
object:ViewTreeObserver.OnPreDrawListener{
overridefunonPreDraw():Boolean{
//Checkiftheinitialdataisready.
returnif(viewModel.isReady){
//Thecontentisready;startdrawing.
content.viewTreeObserver.removeOnPreDrawListener(this)
true
}else{
//Thecontentisnotready;suspend.
false
}
}
}
)
}
Java
//Createaneweventfortheactivity.
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
//Setthelayoutforthecontentview.
setContentView(R.layout.main_activity);
//SetupanOnPreDrawListenertotherootview.
finalViewcontent=findViewById(android.R.id.content);
content.getViewTreeObserver().addOnPreDrawListener(
newViewTreeObserver.OnPreDrawListener(){
@Override
publicbooleanonPreDraw(){
//Checkiftheinitialdataisready.
if(mViewModel.isReady()){
//Thecontentisready;startdrawing.
content.getViewTreeObserver().removeOnPreDrawListener(this);
returntrue;
}else{
//Thecontentisnotready;suspend.
returnfalse;
}
}
});
}
自定义用于关闭启动画面的动画
您可以通过Activity.getSplashScreen()进一步自定义启动画面的动画。
Kotlin
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
//...
//Addacallbackthat'scalledwhenthesplashscreenisanimatingto
//theappcontent.
splashScreen.setOnExitAnimationListener{splashScreenView->
//Createyourcustomanimation.
valslideUp=ObjectAnimator.ofFloat(
splashScreenView,
View.TRANSLATION_Y,
0f,
-splashScreenView.height.toFloat()
)
slideUp.interpolator=AnticipateInterpolator()
slideUp.duration=200L
//CallSplashScreenView.removeattheendofyourcustomanimation.
slideUp.doOnEnd{splashScreenView.remove()}
//Runyouranimation.
slideUp.start()
}
}
Java
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
//...
//Addacallbackthat'scalledwhenthesplashscreenisanimatingto
//theappcontent.
getSplashScreen().setOnExitAnimationListener(splashScreenView->{
finalObjectAnimatorslideUp=ObjectAnimator.ofFloat(
splashScreenView,
View.TRANSLATION_Y,
0f,
-splashScreenView.getHeight()
);
slideUp.setInterpolator(newAnticipateInterpolator());
slideUp.setDuration(200L);
//CallSplashScreenView.removeattheendofyourcustomanimation.
slideUp.addListener(newAnimatorListenerAdapter(){
@Override
publicvoidonAnimationEnd(Animatoranimation){
splashScreenView.remove();
}
});
//Runyouranimation.
slideUp.start();
});
}
在此回调开始时,启动画面上动画形式的矢量可绘制对象已经开始。
根据应用启动的时长,可绘制对象可能在其动画的中间。
使用SplashScreenView.getIconAnimationStart可了解动画何时开始。
您可以按如下方式计算图标动画的剩余时长:
Kotlin
//Getthedurationoftheanimatedvectordrawable.
valanimationDuration=splashScreenView.iconAnimationDuration
//Getthestarttimeoftheanimation.
valanimationStart=splashScreenView.iconAnimationStart
//Calculatetheremainingdurationoftheanimation.
valremainingDuration=if(animationDuration!=null&&animationStart!=null){
(animationDuration-Duration.between(animationStart,Instant.now()))
.toMillis()
.coerceAtLeast(0L)
}else{
0L
}
Java
//Getthedurationoftheanimatedvectordrawable.
DurationanimationDuration=splashScreenView.getIconAnimationDuration();
//Getthestarttimeoftheanimation.
InstantanimationStart=splashScreenView.getIconAnimationStart();
//Calculatetheremainingdurationoftheanimation.
longremainingDuration;
if(animationDuration!=null&&animationStart!=null){
remainingDuration=animationDuration.minus(
Duration.between(animationStart,Instant.now())
).toMillis();
remainingDuration=Math.max(remainingDuration,0L);
}else{
remainingDuration=0L;
}
ContentandcodesamplesonthispagearesubjecttothelicensesdescribedintheContentLicense.JavaandOpenJDKaretrademarksorregisteredtrademarksofOracleand/oritsaffiliates.
Lastupdated2022-08-02UTC.
[{
"type":"thumb-down",
"id":"missingTheInformationINeed",
"label":"没有我需要的信息"
},{
"type":"thumb-down",
"id":"tooComplicatedTooManySteps",
"label":"太复杂/步骤太多"
},{
"type":"thumb-down",
"id":"outOfDate",
"label":"内容需要更新"
},{
"type":"thumb-down",
"id":"translationIssue",
"label":"翻译问题"
},{
"type":"thumb-down",
"id":"samplesCodeIssue",
"label":"示例/代码问题"
},{
"type":"thumb-down",
"id":"otherDown",
"label":"其他"
}]
[{
"type":"thumb-up",
"id":"easyToUnderstand",
"label":"易于理解"
},{
"type":"thumb-up",
"id":"solvedMyProblem",
"label":"解决了我的问题"
},{
"type":"thumb-up",
"id":"otherUp",
"label":"其他"
}]
Twitter
在Twitter上关注@AndroidDev
YouTube
在YouTube上访问“AndroidDevelopers”频道
LinkedIn
在LinkedIn上与Android开发者社区交流沟通
关于Android
Android
适用于企业的Android
安全
源代码
新闻
博客
播客
发现
游戏
机器学习
隐私权政策
5G
Android设备
大屏幕
WearOS
AndroidTV
AndroidforCars
AndroidThings
Chrome操作系统设备
版本
Android11
Android10
Pie
Oreo
Nougat
Marshmallow
Lollipop
KitKat
文档和下载
AndroidStudio指南
开发者指南
API参考
下载Studio
AndroidNDK
支持
报告平台错误
报告文档错误
GooglePlaysupport
参加调查研究
Android
Chrome
Firebase
GoogleCloudPlatform
所有产品
隐私权政策
许可
品牌指南
通过电子邮件接收资讯和提示
订阅
English
BahasaIndonesia
Español–AméricaLatina
Português–Brasil
TiếngViệt
中文–简体
中文–繁體
日本語
한국어
延伸文章資訊
- 1啟動畫面
重要事項: 如果您先前已在Android 11 或以下版本中實作了自訂啟動畫面,就必須將應用程式遷移至 SplashScreen API,以確保其可在Android 12 及以上 ...
- 2帶動畫的啟動畫面- android - 他山教程
此示例顯示了一個簡單但有效的啟動畫面,其中包含可以使用Android Studio 建立的動畫。 第1 步:建立動畫. 在res 目錄中建立一個名為anim ...
- 3Android Splash Screen 啟動畫面| Android Fly程式筆記
現在市面上的Android打開的時候,大部分都會有Splash 啟動畫面,Splash是等待裡面的處理程序處理好以後,再打開程式,創建一個新的Androoid Splash ...
- 4启动画面| Android 开发者
从Android 12 开始,在搭载Android 12 或更高版本的设备上运行时,所有应用都将拥有启动动画。这包括启动时的进入应用动作、显示应用图标的启动画面,以及 ...
- 5Android App歡迎畫面(幾秒後進入主頁面) @ 嵌入式的復健筆記
本篇是將cookiesp大大的文章內碼部份加以描述,透過Android中的『AndroidManifest.xml』檔來設定歡迎畫面,並在歡迎畫面的『Activity.java』檔中經過 ...