Od Androida 12 interfejs API SplashScreen
umożliwia uruchamianie aplikacji z użyciem animacji, w tym przejścia do aplikacji w momencie uruchamiania, ekranu powitalnego z ikoną aplikacji i przejścia do samej aplikacji. SplashScreen
to właściwość Window
, dlatego obejmuje Activity
.
Ekran powitalny zawiera standardowe elementy interfejsu przy każdym uruchomieniu aplikacji, ale można go dostosować, aby zachować unikalną markę.
Oprócz interfejsu API platformy SplashScreen
możesz też używać biblioteki compat SplashScreen
, która opakowuje interfejs API SplashScreen
.
Jak działa ekran powitalny
Gdy użytkownik uruchomi aplikację, gdy jej proces nie jest uruchomiony („na zimno”) lub gdy Activity
nie zostanie utworzone (gorące uruchomienie), następuje takie zdarzenia:
System wyświetla ekran powitalny za pomocą motywów i wszelkich zdefiniowanych przez Ciebie animacji.
Gdy aplikacja będzie gotowa, ekran powitalny zostanie zamknięty, a aplikacja się wyświetli.
Ekran powitalny nigdy nie pojawia się podczas gorącego uruchomienia.
Elementy i mechanika ekranu powitalnego
Elementy ekranu powitalnego są zdefiniowane w plikach zasobów XML w pliku manifestu Androida. Każdy element ma swoją wersję w trybie jasnym i ciemnym.
Dostosowywane elementy ekranu powitalnego składają się z ikony aplikacji, tła ikony i tła okna:
Weź pod uwagę te elementy widoczne na rysunku 2:
1 Ikona aplikacji musi być rysowalna w formacie wektorowym. Może on być statyczny lub animowany. Chociaż czas trwania animacji może być nieograniczony, zalecamy nieprzekraczanie 1000 milisekund. Domyślną ikoną programu jest ikona programu uruchamiającego.
2 Tło ikony jest opcjonalne i przydatne, jeśli potrzebujesz większego kontrastu między ikoną a tłem okna. Jeśli użyjesz ikony adaptacyjnej, jej tło będzie wyświetlane, gdy kontrast będzie wystarczająco kontrastowy z tłem okna.
3 Podobnie jak w przypadku ikon adaptacyjnych jedna trzecia pierwszego planu jest maskowana.
4 Tło okna jest w jednym nieprzezroczystym kolorze. Jeśli tło okna jest ustawione jako zwykły kolor, będzie ono używane domyślnie nawet wtedy, gdy atrybut nie zostanie ustawiony.
Wymiary ekranu powitalnego
Ikona ekranu powitalnego ma te same specyfikacje co ikony adaptacyjne:
- Obraz związany z marką: musi mieć wymiary 200 × 80 dp.
- Ikona aplikacji z tłem ikony: musi mieć wymiary 240 × 240 dp i mieści się w okręgu o średnicy 160 dp.
- Ikona aplikacji bez tła ikony: musi mieć wymiary 288 × 288 dp i mieścić się w okręgu o średnicy 192 dp.
Jeśli na przykład obraz ma pełnowymiarowy rozmiar, czyli 300 × 300 dp, ikona musi pasować do okręgu o średnicy 200 dp. Wszystko poza okręgiem staje się niewidoczne (zamaskowane).
Animacje ekranu powitalnego i sekwencja uruchamiania
Dodatkowe opóźnienia są często związane z uruchamianiem aplikacji „na zimno”. Dodanie animowanej ikony do ekranu powitalnego jest oczywistym elementem estetyki i zapewnia lepszą jakość obsługi. Badania opinii użytkowników pokazują, że widoczny czas uruchamiania podczas wyświetlania animacji krótszy.
Animacja ekranu powitalnego jest umieszczona w komponentach sekwencji uruchamiania, jak pokazano na rysunku 4.
Wprowadź animację: obejmuje to widok systemu na ekran powitalny. Jest sterowany przez system i nie można go dostosowywać.
Ekran powitalny (widoczny w trakcie części sekwencji oczekiwania): ekran powitalny można dostosować, dodając własną animację logo i elementy marki. Aby działać prawidłowo, musi spełniać wymagania opisane na tej stronie.
Zakończ animację: składa się z animacji ukrywającej ekran powitalny. Jeśli chcesz dostosować ją, użyj przycisku
SplashScreenView
i jego ikony. Możesz na nich uruchamiać dowolną animację z ustawieniami przekształcenia, przezroczystości i koloru. W takim przypadku ręcznie usuń ekran powitalny po zakończeniu animacji.
Gdy uruchomisz animację ikony, uruchomienie aplikacji umożliwi pominięcie tej sekwencji w sytuacjach, gdy aplikacja jest gotowa do uruchomienia wcześniej. Aplikacja uruchamia onResume()
lub ekran powitalny automatycznie wyłącza się, więc zadbaj o to, by można było łatwo pominąć ten ruch. Ekran powitalny można zamknąć za pomocą onResume()
tylko wtedy, gdy aplikacja jest stabilna pod względem wizualnym. Nie trzeba w tym celu korzystać z dodatkowych elementów sterujących. Przedstawienie niepełnego interfejsu może być rażące dla użytkowników i sprawiać wrażenie nieprzewidywalności lub braku dopracowania.
Wymagania dotyczące animacji na ekranie powitalnym
Ekran powitalny musi spełniać te wymagania:
Ustaw kolor tła pojedynczego okna bez przezroczystości. Tryby dzienne i nocne są obsługiwane przez bibliotekę
SplashScreen
Comppat.Upewnij się, że animowana ikona spełnia te wymagania:
- Format: ikona musi być w formacie XML AnimatedVectorDrawable (AVD).
- Wymiary: ikona AVD musi być 4 razy większa niż ikona adaptacyjna:
- Obszar ikony musi mieć rozmiar 432 dp, czyli 4 razy większy obszar niż 108 dp niezamaskowanej ikony adaptacyjnej.
- Wewnętrzna 2/3 obrazu jest widoczna na ikonie programu uruchamiającego i musi mieć 288 dp, czyli 4 razy więcej niż 72 dp, który tworzą zamaskowane wewnętrzny obszar ikony adaptacyjnej.
- Czas trwania: w przypadku telefonów zalecamy nie więcej niż 1000 ms. Możesz użyć opóźnionego rozpoczęcia, ale nie może on być dłuższy niż 166 ms. Jeśli czas uruchamiania aplikacji przekracza 1000 ms, rozważ użycie animacji w pętli.
Wyznacz odpowiedni moment na zamknięcie ekranu powitalnego, który ma miejsce podczas wczytywania pierwszej klatki aplikacji. Możesz go jeszcze bardziej dostosować w sposób opisany w sekcji o utrzymywaniu ekranu powitalnego przez dłuższy czas.
Zasoby ekranu powitalnego
Pobierz przykładowy zestaw startowy, który pokazuje, jak utworzyć, sformatować i wyeksportować animację do formatu AVD. Obejmują one:
- Plik projektu animacji Adobe After Effects.
- Końcowy wyeksportowany plik XML AVD.
- Przykładowy GIF animacji.
Pobierając te pliki, wyrażasz zgodę na Warunki korzystania z usług Google.
Sposoby obchodzenia się z danymi w tej usłudze przedstawiamy w Polityce prywatności Google.
Dostosowywanie ekranu powitalnego w aplikacji
Domyślnie SplashScreen
używa atrybutu windowBackground
motywu, jeśli
windowBackground
jest jednym kolorem. Aby dostosować ekran powitalny, dodaj atrybuty do motywu aplikacji.
Ekran powitalny aplikacji możesz dostosować, wykonując jedną z tych czynności:
Ustaw atrybuty motywu, aby zmienić jego wygląd.
Wyświetlaj na ekranie przez dłuższy czas.
Dostosuj animację zamykającą ekran powitalny.
Rozpocznij
Podstawowa biblioteka SplashScreen
umożliwia korzystanie z ekranu powitalnego Androida 12 na wszystkich urządzeniach z poziomu interfejsu API 23. Aby dodać go do projektu, dodaj do pliku build.gradle
ten fragment kodu:
Odlotowy
dependencies { implementation "androidx.core:core-splashscreen:1.0.0" }
Kotlin
dependencies { implementation("androidx.core:core-splashscreen:1.0.0") }
Ustaw motyw ekranu powitalnego, aby zmienić jego wygląd
Aby dostosować ekran powitalny aplikacji, możesz podać te atrybuty w motywie Activity
. Jeśli masz już starszą implementację ekranu powitalnego, która korzysta z takich atrybutów jak android:windowBackground
, rozważ przesłanie pliku zasobów alternatywnych dla Androida 12 lub nowszego.
Aby wypełnić tło pojedynczym kolorem, użyj parametru
windowSplashScreenBackground
:<item name="android:windowSplashScreenBackground">@color/...</item>
Użyj
windowSplashScreenAnimatedIcon
, aby zastąpić ikonę na środku okna początkowego.W przypadku aplikacji kierowanych tylko na Androida 12 (poziom API 32) wykonaj te czynności:
Jeśli obiekt można animować i rysować za pomocą metod
AnimationDrawable
iAnimatedVectorDrawable
, ustaw parametrwindowSplashScreenAnimationDuration
, aby odtworzyć animację i wyświetlić okno początkowe. Nie jest to wymagane w przypadku Androida 13, ponieważ czas trwania jest ustalany bezpośrednio na podstawie parametruAnimatedVectorDrawable
.<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
Używaj właściwości
windowSplashScreenAnimationDuration
, aby określić czas trwania animacji ikony na ekranie powitalnym. Nie ma to wpływu na rzeczywisty czas wyświetlania ekranu powitalnego, ale możesz go przywrócić podczas dostosowywania animacji wyjściowej ekranu powitalnego za pomocą poleceniaSplashScreenView.getIconAnimationDuration
. Więcej informacji znajdziesz w sekcji dotyczącej utrzymywania ekranu powitalnego przez dłuższy czas.<item name="android:windowSplashScreenAnimationDuration">1000</item>
Aby ustawić tło za ikoną ekranu powitalnego, użyj funkcji
windowSplashScreenIconBackgroundColor
. Jest to przydatne, gdy kontrast między tłem okna a ikoną nie jest wystarczający.<item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>
Za pomocą
windowSplashScreenBrandingImage
możesz ustawić obraz, który będzie wyświetlany u dołu ekranu powitalnego. ale zgodnie z wytycznymi dotyczącymi wyglądu nie zaleca się używania obrazu marki.<item name="android:windowSplashScreenBrandingImage">@drawable/...</item>
Za pomocą parametru
windowSplashScreenBehavior
możesz określić, czy na Androidzie 13 i nowszych aplikacja ma zawsze wyświetlać ikonę na ekranie powitalnym. Wartość domyślna to 0, co powoduje wyświetlenie ikony na ekranie powitalnym, jeśli działanie polegające na uruchomieniu ustawiasplashScreenStyle
naSPLASH_SCREEN_STYLE_ICON
lub jest zgodne z działaniem systemu, jeśli działanie uruchamiania nie ma określonego stylu. Jeśli nie chcesz nigdy wyświetlać pustego ekranu powitalnego i zawsze chcesz, aby animowana ikona była zawsze widoczna, ustaw wartośćicon_preferred
.<item name="android:windowSplashScreenBehavior">icon_preferred</item>
Wyświetlaj ekran powitalny przez dłuższy czas
Ekran powitalny znika, gdy tylko aplikacja wyrenderuje pierwszą klatkę. Jeśli chcesz ładować niewielką ilość danych, na przykład asynchroniczne ładowanie ustawień w aplikacji z dysku lokalnego, możesz użyć ViewTreeObserver.OnPreDrawListener
, aby zawiesić aplikację i wyciągnąć pierwszą klatkę.
Jeśli początkowa aktywność zakończy się przed rysowaniem – na przykład gdy nie ustawisz widoku treści i nie zakończysz go przed onResume
– odbiornik wstępnego rysowania nie jest potrzebny.
Kotlin
// Create a new event for the activity. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Set the layout for the content view. setContentView(R.layout.main_activity) // Set up an OnPreDrawListener to the root view. val content: View = findViewById(android.R.id.content) content.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { // Check whether the initial data is ready. return if (viewModel.isReady) { // The content is ready. Start drawing. content.viewTreeObserver.removeOnPreDrawListener(this) true } else { // The content isn't ready. Suspend. false } } } ) }
Java
// Create a new event for the activity. @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the layout for the content view. setContentView(R.layout.main_activity); // 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() { // Check whether the initial data is ready. if (mViewModel.isReady()) { // The content is ready. Start drawing. content.getViewTreeObserver().removeOnPreDrawListener(this); return true; } else { // The content isn't ready. Suspend. return false; } } }); }
Dostosowywanie animacji zamykającej ekran powitalny
Animację ekranu powitalnego możesz jeszcze bardziej dostosować w Activity.getSplashScreen()
.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // Add a callback that's called when the splash screen is animating to the // app content. splashScreen.setOnExitAnimationListener { splashScreenView -> // Create your custom animation. val slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.height.toFloat() ) slideUp.interpolator = AnticipateInterpolator() slideUp.duration = 200L // Call SplashScreenView.remove at the end of your custom animation. slideUp.doOnEnd { splashScreenView.remove() } // Run your animation. slideUp.start() } }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... // Add a callback that's called when the splash screen is animating to the // app content. getSplashScreen().setOnExitAnimationListener(splashScreenView -> { final ObjectAnimator slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.getHeight() ); slideUp.setInterpolator(new AnticipateInterpolator()); slideUp.setDuration(200L); // Call SplashScreenView.remove at the end of your custom animation. slideUp.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { splashScreenView.remove(); } }); // Run your animation. slideUp.start(); }); }
Na początku tego wywołania zwrotnego rozpoczyna się animowany wektor wektorowy, który można rysować na ekranie powitalnym. W zależności od tego, jak długo trwa uruchamianie aplikacji, element rysunkowy może znajdować się w środku animacji. Używaj danych SplashScreenView.getIconAnimationStart
, aby sprawdzić, kiedy rozpoczęła się animacja. Pozostały czas animacji ikony możesz obliczyć w następujący sposób:
Kotlin
// Get the duration of the animated vector drawable. val animationDuration = splashScreenView.iconAnimationDuration // Get the start time of the animation. val animationStart = splashScreenView.iconAnimationStart // Calculate the remaining duration of the animation. val remainingDuration = if (animationDuration != null && animationStart != null) { (animationDuration - Duration.between(animationStart, Instant.now())) .toMillis() .coerceAtLeast(0L) } else { 0L }
Java
// Get the duration of the animated vector drawable. Duration animationDuration = splashScreenView.getIconAnimationDuration(); // Get the start time of the animation. Instant animationStart = splashScreenView.getIconAnimationStart(); // Calculate the remaining duration of the animation. long remainingDuration; if (animationDuration != null && animationStart != null) { remainingDuration = animationDuration.minus( Duration.between(animationStart, Instant.now()) ).toMillis(); remainingDuration = Math.max(remainingDuration, 0L); } else { remainingDuration = 0L; }
Dodatkowe materiały
- Przeprowadź migrację obecnego wdrożenia ekranu powitalnego na Androida 12 lub nowszego
- Now w Androidzie, która pokazuje rzeczywistą implementację ekranu powitalnego