Ekran kesimlerini destekleme

"Oluştur" yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Oluşturma'da ekran kesimleriyle nasıl çalışacağınızı öğrenin.

Ekran kesimi, bazı cihazlarda ekran yüzeyine kadar uzanan bir alandır. Uçtan uca deneyime olanak tanırken cihazın ön tarafındaki önemli sensörler için alan sağlar.

Android, Android 9 (API düzeyi 28) ve sonraki sürümleri çalıştıran cihazlarda ekran kesimlerini destekler. Ancak cihaz üreticileri, Android 8.1 veya önceki sürümleri çalıştıran cihazlarda ekran kesimlerini de destekleyebilir.

Bu dokümanda, kesikli cihazlar için desteğin nasıl uygulanacağı açıklanmaktadır. Buna, kesim alanının, yani ekran yüzeyindeki kesimi içeren kenardan kenara dikdörtgenle nasıl çalışılacağı da dahildir.

Üst orta ekran kesimi örneğini gösteren resim
Şekil 1. 1 Ekran kesimi.

Uygulamanızın kesim alanlarını nasıl işleyeceğini seçin

İçeriğinizin bir kesim alanıyla üst üste binmesini istemiyorsanız içeriğinizin durum çubuğu ve gezinme çubuğuyla çakışmadığından emin olmanız genellikle yeterli olur. Kesme alanında oluşturma yapıyorsanız her bir kesimin güvenli eklerini ve sınırlayıcı kutusunu içeren bir DisplayCutout nesnesi almak için WindowInsetsCompat.getDisplayCutout() aracını kullanın. Bu API'ler, içeriğinizin kesimle çakışıp çakışmadığını kontrol etmenizi sağlar. Böylece, gerektiğinde yeniden konumlandırabilirsiniz.

İçeriğin kesim alanının arkasına yerleştirilip yerleştirilmediğini de belirleyebilirsiniz. layoutInDisplayCutoutMode pencere düzeni özelliği, içeriğinizin kesim alanında nasıl çizileceğini kontrol eder. layoutInDisplayCutoutMode öğesini şu değerlerden birine ayarlayabilirsiniz:

Kesme modunu programatik olarak veya etkinliğinizde bir stil belirleyerek ayarlayabilirsiniz. Aşağıdaki örnekte, LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES özelliğini etkinliğe uygulamak için kullanılacak stil tanımlanmaktadır.

<style name="ActivityTheme">
  <item name="android:windowLayoutInDisplayCutoutMode">
    shortEdges <!-- default, shortEdges, or never -->
  </item>
</style>

Aşağıdaki bölümlerde farklı kesme modları daha ayrıntılı olarak açıklanmaktadır.

Varsayılan davranış

Varsayılan olarak, özel işaret ayarlanmamış dikey modda, kesimi olan bir cihazdaki durum çubuğu, en az kesimin yüksekliği kadar yüksek olacak şekilde yeniden boyutlandırılır ve içeriğiniz aşağıdaki alanda gösterilir. Yatay veya tam ekran modunda, uygulama pencereniz sinemaskop uygulanır. Böylece içeriğinizin hiçbiri kesim alanında gösterilmez.

Kısa kenar kesme alanlarında içerik oluşturun

Video, fotoğraf, harita ve oyun gibi bazı içeriklerin kesit alanında oluşturulması, kullanıcılara daha etkileyici, uçtan uca bir deneyim sağlamanın mükemmel bir yolu olabilir. LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES ile içerik, sistem çubuklarının gizli veya görünür olup olmadığına bakılmaksızın, hem dikey hem de yatay modda ekranın kısa kenarındaki kesim alanına uzanır. Bu modu kullanırken hiçbir önemli içeriğin kesim alanıyla çakışmadığından emin olun.

Aşağıdaki resimde, dikey konumdaki bir cihaz için LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES örneği verilmiştir:

Dikey moddayken kesim alanında içerik oluşturmayı gösteren resim
Şekil 2. Dikey moddayken kesim alanında içerik oluşturma.

Aşağıdaki resimde, yatay konumdaki bir cihaz için LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES örneği verilmiştir:

Yatay moddayken kesim alanında içerik oluşturmayı gösteren resim
Şekil 3. Yatay moddayken kesim alanında içerik oluşturma.

Bu modda pencere, sistem çubuklarını gizleyip gizlemediğinden bağımsız olarak hem dikey hem de yatay modda ekranın kısa kenarındaki kesimlerin altından uzanır.

Köşedeki bir kesimin kısa kenarda olduğu kabul edilir:

Köşesinde kesimli bir cihazın gösterildiği resim
Şekil 4. Köşesi kesik bir cihaz.

Ekran kesimi alanındaki hiçbir zaman içerik oluşturma

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER kullanıldığında, pencerenin kesim alanıyla örtüşmesine izin verilmez.

Aşağıda dikey LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği verilmiştir:

Dikey için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER öğesini gösteren resim
Şekil 5. Dikey mod için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği.

Aşağıda yatay moddaki LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği verilmiştir:

Yatay için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER öğesini gösteren resim
Şekil 6. Yatay moddaki LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği.

Ekran kesimi desteği için en iyi uygulamalar

Ekran kesimleriyle çalışırken aşağıdakileri göz önünde bulundurun:

  • Kullanıcı arayüzündeki önemli öğelerin yerleşimine dikkat edin. Kesme alanının önemli metinleri, kontrolleri veya diğer bilgileri gizlemesine izin vermeyin.
  • Hassas dokunuş tanıma gerektiren etkileşimli öğeleri kesim alanına yerleştirmeyin veya genişletmeyin. Kesme alanında dokunma hassasiyeti daha düşük olabilir.
  • Mümkün olduğunda, durum çubuğu yüksekliğini almak ve içeriğinize uygulanacak uygun dolguyu belirlemek için WindowInsetsCompat değerini kullanın. İçeriğin çakışmasına veya kesilmesine neden olabileceğinden, durum çubuğu yüksekliğini koda gömmekten kaçının.

    Hatalı ek kurulumu için üst kısımdaki içeriğin kesildiğini gösteren resim
    Şekil 7. İçeriğin çakışmasını veya kesilmesini önlemek için WindowInsetsCompat kullanın.
  • Uygulamanızın ne kadar pencere alanı kullandığını belirlemek için View.getLocationInWindow() değerini kullanın. Uygulamanın tüm pencereyi kullandığını varsaymayın ve View.getLocationOnScreen() kullanmayın.

  • Uygulamanızın yoğun içerik moduna geçmesi ve bu moddan çıkması gerekiyorsa shortEdges veya never kesme modlarını kullanın. Varsayılan kesme davranışı, yoğun içerik modundayken sistem çubukları varken uygulamanızdaki içeriğin kesim alanında oluşturulmasına neden olabilir. Bu durum, aşağıdaki örnekte gösterildiği gibi geçişler sırasında içeriğin yukarı ve aşağı hareket etmesine neden olur.

    Geçişler sırasında yukarı ve aşağı hareket eden içeriği gösteren resim.
    Şekil 8. Geçişler sırasında yukarı ve aşağı hareket eden içerik örneği.
  • Uygulamanız sinemaskop yapıldığında ekranın tamamını kullanmadığından, yoğun içerik modunda pencere veya ekran koordinatlarını kullanma konusunda dikkatli olun. Sinemaskop olduğundan, ekran başlangıcından gelen koordinatlar pencere başlangıcından gelen koordinatlarla aynı değildir. getLocationOnScreen() kullanarak ekran koordinatlarını gerektiğinde görünümün koordinatlarına dönüştürebilirsiniz. Aşağıdaki resimde, içerik sinemaskop yapıldığında koordinatların nasıl farklılık gösterdiği gösterilmektedir:

    İçerik sinemaskopken pencere ve ekran koordinatlarını gösteren bir resim.
    Şekil 9. İçerik sinemaskop yapıldığında pencere ve ekran koordinatları.
  • MotionEvent işini yaparken benzer koordinat sorunlarından kaçınmak için MotionEvent.getX() ve MotionEvent.getY() özelliklerini kullanın. MotionEvent.getRawX() veya MotionEvent.getRawY() kullanmayın.

İçeriğinizin nasıl oluşturulduğunu test edin

Uygulamanızın tüm ekranlarını ve deneyimlerini test edin. Mümkünse farklı kesme türlerine sahip cihazlarda test edin. Kesik bir cihazınız yoksa aşağıdakileri yaparak Android 9 veya sonraki sürümleri çalıştıran herhangi bir cihaz ya da emülatörde yaygın kesim yapılandırmalarını simüle edebilirsiniz:

  1. Geliştirici seçeneklerini etkinleştirin.
  2. Geliştirici seçenekleri ekranında Çizim bölümüne gidin ve Kesme içeren bir ekranı simüle et'i seçin.
  3. Kesme türünü seçin.

    Emülatörde ekran kesiminin nasıl simüle edileceğini gösteren resim
    Şekil 10. içeriğinizin nasıl oluşturulduğunu test etmek için geliştirici seçenekleri.

Ek kaynaklar