Başlangıç ekranları

SplashScreen API, Android 12'den itibaren uygulamaların animasyonla başlatılabilmesini sağlar. Bu API'nin lansman sırasında uygulamaya giriş hareketi, uygulama simgenizi gösteren başlangıç ekranı ve uygulamanızın kendisine geçiş gibi animasyonlarla başlamasını sağlar. SplashScreen, bir Window öğesidir ve bu nedenle Activity öğesini kapsar.

Şekil 1. Başlangıç ekranı.

Başlangıç ekranı deneyimi, her uygulama lansmanına standart tasarım öğeleri getirirken aynı zamanda uygulamanızın benzersiz markasını koruyabilmesi için özelleştirilebilir.

SplashScreen platform API'sinin yanı sıra SplashScreen API'yi sarmalayan SplashScreen uyumluluk kitaplığını da kullanabilirsiniz.

Başlangıç ekranının işleyiş şekli

Kullanıcı, uygulamanın işlemi çalışmıyorken uygulamayı başlattığında (baştan başlatma) veya Activity oluşturulmadığında (hazır başlatma) aşağıdaki etkinlikler gerçekleşir:

  1. Sistem, başlangıç ekranını, tanımladığınız temaları ve animasyonları kullanarak gösterir.

  2. Uygulama hazır olduğunda başlangıç ekranı kapatılır ve uygulama görüntülenir.

Hazır başlatma sırasında başlangıç ekranı hiçbir zaman gösterilmez.

Başlangıç ekranındaki öğeler ve mekanikler

Başlangıç ekranı öğeleri, Android manifest dosyasındaki XML kaynak dosyalarıyla tanımlanır. Her öğenin açık ve koyu mod sürümleri vardır.

Başlangıç ekranının özelleştirilebilir öğeleri uygulama simgesi, simge arka planı ve pencere arka planından oluşur:

Başlangıç ekranında bulunan öğeleri gösteren resim
Şekil 2. Başlangıç ekranının özelleştirilebilir öğeleri.

Şekil 2'de gösterilen aşağıdaki unsurları göz önünde bulundurun:

1 Uygulama simgesi, çekilebilir bir vektör olmalıdır. Statik veya animasyonlu olabilir. Animasyonların süresi sınırsız olsa da 1.000 milisaniyeyi aşmamanızı öneririz. Başlatıcı simgesi varsayılandır.

2 Simge arka planı, simge ile pencere arka planı arasında daha fazla kontrasta ihtiyacınız olduğunda isteğe bağlı ve kullanışlıdır. Uyarlanabilir bir simge kullanırsanız, pencere arka planıyla yeterli kontrast varsa arka planı görüntülenir.

3 Uyarlanabilir simgelerde olduğu gibi, ön planın üçte biri maskelenir.

4 Pencere arka planı tek bir opak renkten oluşur. Pencere arka planı ayarlanmışsa ve düz bir renkse, özellik ayarlanmamışsa varsayılan olarak bu renk kullanılır.

Başlangıç ekranı boyutları

Başlangıç ekranı simgesi, aşağıdaki gibi uyarlanabilir simgeler ile aynı özellikleri kullanır:

  • Markalı resim: Bu 200×80 dp olmalıdır.
  • Simge arka planı olan uygulama simgesi: Bu simge 240×240 dp olmalı ve 160 dp çaplı bir daire içine sığmalıdır.
  • Simge arka planı olmayan uygulama simgesi: 288×288 dp boyutunda olmalı ve 192 dp çaplı bir daire içine sığmalıdır.

Örneğin, bir resmin tam boyutu 300×300 dp ise simge, 200 dp çaplı bir daire içine sığmalıdır. Çemberin dışındaki her şey görünmez (maskeli) olur.

Düz ve şeffaf arka plan için farklı simge boyutlarını gösteren resim
Şekil 3. Sırasıyla düz ve şeffaf arka planlar için başlangıç ekranı simge boyutları.

Başlangıç ekranı animasyonları ve başlatma sırası

Ek gecikme genellikle uygulamanın baştan başlatma sırasında başlatılmasıyla ilişkilidir. Başlangıç ekranınıza animasyonlu simge eklemek, bariz bir estetik görünüm sunar ve daha üst düzey bir deneyim sunar. Kullanıcı araştırması, animasyon izlerken algılanan başlatma süresinin daha az olduğunu göstermektedir.

Başlangıç ekranı animasyonu, Şekil 4'te gösterildiği gibi başlatma dizisi bileşenlerine yerleştirilir.

Başlatıcı simgesine dokunulduğunda ve simge büyüdükçe ekranı doldurduğunda, art arda on iki karede başlatma sırasını gösteren resim
Şekil 4. Başlatma sırası.
  1. Animasyon girme: Başlangıç ekranına giden sistem görünümünden oluşur. Sistem tarafından kontrol edilir ve özelleştirilemez.

  2. Başlangıç ekranı (dizinin "bekleme" bölümünde gösterilir): Başlangıç ekranı, kendi logo animasyonunuzu ve markalamanızı sağlayabilecek şekilde özelleştirilebilir. Düzgün çalışması için bu sayfada belirtilen şartları karşılaması gerekir.

  3. Animasyondan çık: Bu, başlangıç ekranını gizleyen animasyondan oluşur. Özelleştirmek isterseniz SplashScreenView ve simgesini kullanın. Dönüşüm, opaklık ve renk ayarlarıyla bu resimlerde herhangi bir animasyon çalıştırabilirsiniz. Bu durumda, animasyon tamamlandığında başlangıç ekranını manuel olarak kaldırın.

Simge animasyonunu çalıştırırken uygulama başlatma özelliği, uygulamanın daha erken hazır olduğu durumlarda sırayı atlama seçeneği sunar. Uygulama, onResume() veya başlangıç ekranı otomatik olarak zaman aşımına uğradığından hareketin rahatça atlanabileceğinden emin olun. Başlangıç ekranı, yalnızca uygulama görsel açıdan kararlı olduğunda onResume() ile kapatılmalıdır. Bu nedenle, ek döner simgelere gerek yoktur. Eksik bir arayüze sahip olmak kullanıcılar için rahatsız edici olabilir ve öngörülemezlik veya kötü görünüm izlenimi yaratabilir.

Başlangıç ekranı animasyonu gereksinimleri

Başlangıç ekranınız aşağıdaki özelliklere uygun olmalıdır:

  • Saydamlığın olmadığı bir tek pencere arka plan rengi ayarlayın. Gündüz ve Gece modu, SplashScreen uyumluluk kitaplığı ile desteklenir.

  • Animasyonlu simgenin aşağıdaki özellikleri karşıladığından emin olun:

    • Biçim: Simge bir AnimatedVectorDrawable (AVD) XML olmalıdır.
    • Boyutlar: AVD simgesi, aşağıdaki gibi uyarlanabilir simgenin dört katı boyutunda olmalıdır:
      • Simge alanı 432 dp, diğer bir deyişle, maskelenmemiş uyarlanabilir bir simgenin 108 dp alanının dört katı olmalıdır.
      • Resmin üçte ikisi başlatıcı simgesinde görünür ve 288 dp olmalıdır. Başka bir deyişle, uyarlanabilir simgenin iç maskelenmiş alanını oluşturan 72 dp'nin dört katı olmalıdır.
    • Süre: Telefonlarda 1.000 ms.yi aşmamanızı öneririz. Geciken bir başlatma kullanabilirsiniz, ancak bu değer 166 ms'den uzun olamaz. Uygulama başlatma süresi 1.000 ms'den uzunsa döngüsel bir animasyon kullanmayı düşünün.
  • Başlangıç ekranını kapatmak için uygun bir zaman belirleyin. Bu, uygulamanız ilk karesini çizerken gerçekleşir. Bunu, başlangıç ekranını daha uzun süre ekranda tutma ile ilgili bölümde açıklandığı şekilde daha fazla özelleştirebilirsiniz.

Başlangıç ekranı kaynakları

Şekil 5. Örnek ortalama görüntüleme süresi

Animasyonların nasıl oluşturulacağını, biçimlendirileceğini ve AVD'ye nasıl aktarılacağını gösteren örnek başlangıç kitini indirin. Bunlardan bazıları:

  • Animasyonun Adobe After Effects proje dosyası.
  • Dışa aktarılan nihai ortalama AVD XML dosyası.
  • Animasyonun örnek GIF'i.

Bu dosyaları indirerek Google Hizmet Şartları'nı kabul etmiş olursunuz.

Google Gizlilik Politikası, verilerin bu hizmette nasıl işlendiğini açıklar.

Uygulamanızdaki başlangıç ekranını özelleştirme

windowBackground tek bir renkse SplashScreen varsayılan olarak temanızın windowBackground öğesini kullanır. Başlangıç ekranını özelleştirmek için uygulama temasına özellikler ekleyin.

Aşağıdakilerin birini yaparak uygulamanızın başlangıç ekranını özelleştirebilirsiniz:

  • Görünümünü değiştirmek için tema özelliklerini ayarlayın.

  • Ekranda daha uzun süre tutun.

  • Başlangıç ekranını kapatmak için animasyonu özelleştirin.

Başlayın

Temel SplashScreen kitaplığı, Android 12 başlangıç ekranını API 23'ten tüm cihazlara getirir. Bu snippet'i projenize eklemek için build.gradle dosyanıza aşağıdaki snippet'i ekleyin:

Eski

dependencies {
    implementation "androidx.core:core-splashscreen:1.0.0"
}

Kotlin

dependencies {
    implementation("androidx.core:core-splashscreen:1.0.0")
}

Başlangıç ekranının görünümünü değiştirmek için bir tema ayarlayın

Uygulamanızın başlangıç ekranını özelleştirmek için Activity temanızda aşağıdaki özellikleri belirtebilirsiniz. android:windowBackground gibi özellikleri kullanan eski bir başlangıç ekranı uygulamanız zaten varsa Android 12 ve sonraki sürümler için alternatif bir kaynak dosyası sağlayabilirsiniz.

  1. Arka planı belirli bir renkle doldurmak için windowSplashScreenBackground değerini kullanın:

    <item name="android:windowSplashScreenBackground">@color/...</item>
    
  2. Başlangıç penceresinin ortasındaki simgeyi değiştirmek için windowSplashScreenAnimatedIcon değerini kullanın.

    Yalnızca Android 12'yi (API düzeyi 32) hedefleyen uygulamalar için aşağıdakileri yapın:

    Nesne, animasyona uygun ve AnimationDrawable ile AnimatedVectorDrawable üzerinden çizilebilirse başlangıç penceresini gösterirken animasyonu oynatmak için windowSplashScreenAnimationDuration öğesini ayarlayın. Süre doğrudan AnimatedVectorDrawable üzerinden tahmin edildiğinden bu süre Android 13 için gerekli değildir.

    <item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
    
  3. Başlangıç ekranı simge animasyonunun süresini belirtmek için windowSplashScreenAnimationDuration değerini kullanın. Bunu ayarlamanın, başlangıç ekranının gösterildiği gerçek süre üzerinde herhangi bir etkisi yoktur ancak SplashScreenView.getIconAnimationDuration kullanarak başlangıç ekranı çıkış animasyonunu özelleştirirken bu değeri alabilirsiniz. Daha fazla bilgi için başlangıç ekranını ekranda daha uzun süre tutma ile ilgili aşağıdaki bölüme bakın.

    <item name="android:windowSplashScreenAnimationDuration">1000</item>
    
  4. Başlangıç ekranı simgesinin arkasında bir arka plan ayarlamak için windowSplashScreenIconBackgroundColor simgesini kullanın. Bu seçenek, pencere arka planı ile simge arasında yeterli kontrast yoksa yararlı olur.

    <item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>
    
  5. Başlangıç ekranının alt kısmında gösterilecek bir resmi ayarlamak için windowSplashScreenBrandingImage aracını kullanabilirsiniz. Ancak tasarım yönergeleri, marka imajı kullanılmasını önermemektedir.

    <item name="android:windowSplashScreenBrandingImage">@drawable/...</item>
    
  6. Android 13 ve sonraki sürümlerde uygulamanızın başlangıç ekranında simgeyi her zaman gösterip göstermeyeceğini belirtmek için windowSplashScreenBehavior aracını kullanabilirsiniz. Varsayılan değer 0'dır. Bu değer, başlatma etkinliği splashScreenStyle öğesini SPLASH_SCREEN_STYLE_ICON olarak ayarlarsa başlangıç ekranında simgeyi görüntüler veya başlatma etkinliği bir stil belirtmiyorsa sistem davranışını uygular. Hiçbir zaman boş bir başlangıç ekranı göstermemeyi tercih ediyor ve her zaman animasyonlu simgenin gösterilmesini istiyorsanız bunu icon_preferred değerine ayarlayın.

    <item name="android:windowSplashScreenBehavior">icon_preferred</item>
    

Başlangıç ekranını ekranda daha uzun süre açık tutma

Uygulamanız ilk karesini çizer çekmez başlangıç ekranı kapanır. Uygulama içi ayarları eşzamansız olarak yüklemek gibi az miktarda veri yüklemeniz gerekiyorsa ViewTreeObserver.OnPreDrawListener kullanarak uygulamanın ilk karesini çizmesini askıya alabilirsiniz.

Başlangıç etkinliğiniz çizimden önce bitiyorsa (örneğin, içerik görünümünü ve bitişini onResume tarihinden önce ayarlamazsanız) önceden çizim işleyiciye gerek yoktur.

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;
                    }
                }
            });
}

Başlangıç ekranını kapatmak için animasyonu özelleştirme

Başlangıç ekranının animasyonunu Activity.getSplashScreen() kullanarak daha fazla özelleştirebilirsiniz.

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();
    });
}

Bu geri çağırmanın başlangıcında başlangıç ekranındaki animasyonlu vektör çekilebilir işlemi başlar. Uygulama başlatma süresine bağlı olarak, çekilebilir öğe animasyonunun ortasında yer alabilir. Animasyonun ne zaman başladığını öğrenmek için SplashScreenView.getIconAnimationStart değerini kullanın. Simge animasyonunun kalan süresini şu şekilde hesaplayabilirsiniz:

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;
}

Ek kaynaklar