啟動畫面

文章推薦指數: 80 %
投票人數:10人

重要事項: 如果您先前已在Android 11 或以下版本中實作了自訂啟動畫面,就必須將應用程式遷移至 SplashScreen API,以確保其可在Android 12 及以上 ... Platform AndroidStudio GooglePlay Jetpack Kotlin Docs Games English BahasaIndonesia Español–AméricaLatina Português–Brasil TiếngViệt 中文–简体 中文–繁體 日本語 한국어 Signin Platform AndroidStudio GooglePlay Jetpack Kotlin Docs Games AndroidDevelopers 啟動畫面 Stayorganizedwithcollections Saveandcategorizecontentbasedonyourpreferences. 重要事項:如果您先前已在Android11或以下版本中實作了自訂啟動畫面,就必須將應用程式遷移至SplashScreenAPI,以確保其可在Android12及以上版本中正確顯示。

如需操作說明,請參閱將現有啟動畫面實作遷移至Android12。

Android12新增了SplashScreenAPI,當在搭載Android12及以上版本的裝置中執行時,會為所有應用程式啟用新的應用程式啟動動畫。

這包括啟動時的應用程式內建動態、顯示應用程式圖示的啟動畫面,以及應用程式自身的轉換。

圖1:啟動畫面樣本 新版服務每次推出應用程式時,都會提供標準設計元素,但您也可以自訂應用程式,讓應用程式保有獨特的品牌宣傳元素。

除了直接使用SplashScreenAPI之外,您亦可使用SplashScreen相容性程式庫,其中也包含了SplashScreenAPI。

啟動畫面的運作方式 當使用者在應用程式執行程序未執行時啟動應用程式(冷啟動)或活動尚未建立(暖啟動)時會發生下列事件。

(熱啟動期間一律不會顯示啟動畫面)。

系統會根據你定義的主題和任何動畫來顯示啟動畫面。

應用程式就緒後,即可關閉啟動畫面並顯示應用程式。

動畫的元素與機制 動畫元素是由Android資訊清單中的XML資源檔案定義。

每種元素都有淺色和深色模式版本。

包括視窗背景、動畫應用程式圖示及圖示背景: 圖2:啟動畫面的可自訂元素 請留意這些元素的以下注意事項: 應用程式圖示(1)應該是一個向量可繪項目,可以是靜態或者是動畫。

雖然動畫時長不限,但建議不超過1,000毫秒。

根據預設,使用了啟動器圖示。

圖示背景(2)是可選項,如果圖示和視窗背景之間需要更高的對比度,則此選項就能派上用場。

如果使用自動調整圖示,當視窗背景的對比度夠高時,就會顯示其背景。

如同自動調整圖示,有三分之一的前景會被遮蓋(3)。

視窗背景(4)包含單一不透明顏色。

如果已設定視窗背景且為純色,當未設定屬性時,則根據預設使用此背景。

啟動畫面尺寸 啟動畫面圖示使用的規格與自動調整圖示相同,如下所示: 品牌圖片:大小應為200×80dp。

含有圖示背景的應用程式圖示:大小應為240×240dp,且符合直徑為160dp的圓環。

不含圖示背景的應用程式圖示:大小應為288×288dp,且符合直徑為192dp的圓環。

舉例來說,如果圖片的原尺寸為300×300dp,圖示應符合直徑200dp的圓環。

圓環以外的所有內容都會被隱藏(遮蓋)。

圖3:分別針對實心和透明背景設計了啟動畫面圖示尺寸 啟動畫面動畫 啟動畫面動畫機制包含進入與結束動畫。

進入動畫包含啟動畫面的檢視畫面。

它由系統控制,無法自訂。

結束動畫由隱藏啟動畫面的動畫放送組成。

如需自訂,必須有SplashScreenView及其圖示的存取權限,並可在其中放送任意動畫、設定其變形、不透明度和顏色。

如果發生這種情況,必須在動畫結束後手動移除啟動畫面。

自訂應用程式中的啟動畫面 根據預設,如果是單色及啟動器圖示,則SplashScreen使用windowBackground主題。

在應用程式主題中新增屬性,才能自訂啟動畫面。

可以透過下列任一方式自訂應用程式的啟動畫面: 設定主題屬性以變更外觀 延長在螢幕上的停留時間 自訂用於關閉啟動畫面的動畫 為啟動畫面設定一個主題以變更外觀 你可以在「活動」主題中指定下列屬性,藉此自訂應用程式的啟動畫面。

如果您繼續使用舊版啟動畫面(使用android:windowBackground等屬性),請考慮提供Android12及以上版本的替代資源檔案。

使用windowSplashScreenBackground在背景中填入特定單一顏色: @color/... 使用windowSplashScreenAnimatedIcon取代起始視窗中央的圖示。

如果物件透過AnimationDrawable和AnimatedVectorDrawable建立動畫屬性及可繪項目,則也必須設定windowSplashScreenAnimationDuration以在顯示起始視窗的同時播放動畫。

@drawable/... 使用windowSplashScreenAnimationDuration表示啟動畫面圖示動畫的持續時間。

做此設定不會影響啟動畫面的實際顯示時間,不過您可以在使用SplashScreenView#getIconAnimationDuration自訂啟動畫面結束動畫時進行擷取。

請參閱下一節的延長啟動畫面的停留時間部分,瞭解更多資訊。

1000 使用windowSplashScreenIconBackgroundColor來設定啟動畫面圖示後的背景。

如果視窗背景與圖示之間的對比度不夠高,這項功能就能派上用場。

@color/... 或者,您也可以使用windowSplashScreenBrandingImage來設定要顯示在啟動畫面底部的圖片。

設計指南不建議使用品牌宣傳圖片。

@drawable/... 延長啟動畫面在螢幕上的停留時間 應用程式會在首次繪製頁框時立即關閉啟動畫面。

如果您需要非同步載入少量資料(例如本機磁碟的應用程式內設定),可以使用ViewTreeObserver.OnPreDrawListener暫停應用程式繪製其首個頁框。

如果您在繪圖前就啟用活動完成(例如沒有在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-05-13UTC. [{ "type":"thumb-down", "id":"missingTheInformationINeed", "label":"MissingtheinformationIneed" },{ "type":"thumb-down", "id":"tooComplicatedTooManySteps", "label":"Toocomplicated/toomanysteps" },{ "type":"thumb-down", "id":"outOfDate", "label":"Outofdate" },{ "type":"thumb-down", "id":"translationIssue", "label":"Translationissue" },{ "type":"thumb-down", "id":"samplesCodeIssue", "label":"Samples/codeissue" },{ "type":"thumb-down", "id":"otherDown", "label":"Other" }] [{ "type":"thumb-up", "id":"easyToUnderstand", "label":"Easytounderstand" },{ "type":"thumb-up", "id":"solvedMyProblem", "label":"Solvedmyproblem" },{ "type":"thumb-up", "id":"otherUp", "label":"Other" }] Twitter Follow@AndroidDevonTwitter YouTube CheckoutAndroidDevelopersonYouTube LinkedIn ConnectwiththeAndroidDeveloperscommunityonLinkedIn MoreAndroid Android AndroidforEnterprise Security Source News Blog Podcasts Discover Gaming MachineLearning Privacy 5G AndroidDevices Largescreens WearOS AndroidTV Androidforcars AndroidThings ChromeOSdevices Releases Android11 Android10 Pie Oreo Nougat Marshmallow Lollipop KitKat DocumentationandDownloads AndroidStudioguide Developersguides APIreference DownloadStudio AndroidNDK Support Reportplatformbug Reportdocumentationbug GooglePlaysupport Joinresearchstudies Android Chrome Firebase GoogleCloudPlatform Allproducts Privacy License Brandguidelines Getnewsandtipsbyemail Subscribe English BahasaIndonesia Español–AméricaLatina Português–Brasil TiếngViệt 中文–简体 中文–繁體 日本語 한국어



請為這篇文章評分?