Ekran kesimlerini destekleme

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

Ekran kesimi, bazı cihazlarda ekran yüzeyine doğru uzanan bir alandır. Cihazın ön tarafındaki önemli sensörler için yer sağlarken uçtan uca bir deneyim sunar.

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ümlerin yüklü olduğu cihazlarda da ekran kesiklerini destekleyebilir.

Bu belgede, ekran kesimi olan cihazlar için desteğin nasıl uygulanacağı açıklanmaktadır. Bu kapsamda, ekran kesimi alanı (ekran kesimini içeren, ekran yüzeyindeki uçtan uca dikdörtgen) ile nasıl çalışılacağı da ele alınmaktadır.

Üst orta kısımda ekran kesimi örneğini gösteren bir resim
Şekil 1. 1 Ekran kesimi.

Uygulamanızın, ekranın üst kısmındaki kamera boşluğu alanlarını nasıl işleyeceğini seçme

İçeriğinizin bir kesme alanı ile çakışmasını istemiyorsanız genellikle içeriğinizin durum çubuğu ve gezinme çubuğu ile çakışmadığından emin olmanız yeterlidir. Kesik alanına oluşturma yapıyorsanız her kesik için güvenli iç kısımları ve sınırlayıcı kutuyu içeren bir DisplayCutout nesnesini almak üzere WindowInsetsCompat.getDisplayCutout() kullanın. Bu API'ler, içeriğinizin çentikle çakışıp çakışmadığını kontrol etmenize olanak tanır. Böylece, gerekirse içeriğinizi yeniden konumlandırabilirsiniz.

Ayrıca, içeriğin kesme alanının arkasında yerleştirilip yerleştirilmeyeceğini de belirleyebilirsiniz. layoutInDisplayCutoutMode Pencere düzeni özelliği, içeriğinizin çentik alanında nasıl çizileceğini kontrol eder. layoutInDisplayCutoutMode değerini aşağıdakilerden birine ayarlayabilirsiniz:

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT: Ekran kesimi bir sistem çubuğunda yer aldığında içerik, kesim alanında oluşturulur. Aksi takdirde pencere, ekran kesimiyle çakışmaz. Örneğin, içerik yatay modda görüntülendiğinde sinemaskop şeklinde olabilir. Uygulamanız SDK 35'i hedefliyorsa bu, kaymayan pencereler için ALWAYS olarak yorumlanır.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS: İçeriğin, kesik alanlara taşmasına her zaman izin verilir. Uygulamanız SDK 35'i hedefliyorsa ve Android 15 çalıştıran bir cihazda kullanılıyorsa uçtan uca ekran görüntüsü sağlamak için kaymayan pencerelerde izin verilen tek mod budur.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES: İçerik, hem dikey hem de yatay modda çentik alanında oluşturulur. Kayan pencereler için kullanmayın. Uygulamanız SDK 35'i hedefliyorsa bu, kaymayan pencereler için ALWAYS olarak yorumlanır.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER: İçerik hiçbir zaman kesik alanda oluşturulmaz. Uygulamanız SDK 35'i hedefliyorsa bu, kaymayan pencereler için ALWAYS olarak yorumlanır.

Kesme modunu programatik olarak veya etkinliğinizde bir stil ayarlayarak belirleyebilirsiniz. Aşağıdaki örnekte, LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES özelliğini etkinliğe uygulamak için bir 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ış

Uygulamanız SDK 35'i hedefliyorsa ve Android 15 cihazda çalışıyorsa LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS varsayılan davranıştır ve LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT, kaymayan pencereler için LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS olarak yorumlanır.

Aksi takdirde, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT varsayılan değerdir.

İçeriği kısa kenar kesme alanlarında oluşturma

Uygulamanız SDK 35'i hedefliyorsa ve Android 15 cihazda çalışıyorsa, LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES kaymayan pencereler için LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS olarak yorumlanır.

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES seçeneğiyle, sistem çubuklarının gizli veya görünür olmasına bakılmaksızın içerik hem dikey hem de yatay modda ekranın kısa kenarındaki oyuk alanına kadar uzanır. Bu modu kullanırken önemli içeriklerin kesme alanı ile çakışmadığından emin olun.

Aşağıdaki resimde, portre modundaki bir cihaz için LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES örneği gösterilmektedir:

Dikey modda içeriklerin çentik alanında oluşturulduğunu gösteren resim
Şekil 2. Dikey moddayken içeriğin çentik alanında oluşturulması.

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

Yatay modda içeriklerin çentik alanında oluşturulduğunu gösteren bir resim
Şekil 3. Yatay modda içeriklerin çentik alanında oluşturulması.

Bu modda pencere, sistem çubuklarını gizleyip gizlemediğine bakılmaksızın hem dikey hem de yatay modda ekranın kısa kenarındaki kesiklerin altına uzanır.

Köşedeki bir kesik, kısa kenarda kabul edilir:

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

İçeriği hiçbir zaman ekran kesimi alanında oluşturma

Uygulamanız SDK 35'i hedefliyorsa ve Android 15 cihazda çalışıyorsa, LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER kaymayan pencereler için LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS olarak yorumlanır.

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER ile pencerenin kesme alanı ile çakışmasına asla izin verilmez.

Aşağıda, LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER'nın portre modundaki bir örneği verilmiştir:

Dikey mod için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER&#39;ı gösteren resim
Şekil 5. Dikey mod için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği.

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

Yatay yön için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER&#39;ı gösteren bir resim
Şekil 6. Yatay modda LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER örneği.

Ekran kesme desteğiyle ilgili en iyi uygulamalar

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

  • Kullanıcı arayüzünün kritik öğelerinin yerleşimine dikkat edin. Kesik alanın önemli metinleri, kontrolleri veya diğer bilgileri kapatmasına izin vermeyin.
  • Hassas dokunma tanıma gerektiren etkileşimli öğeleri, kesme alanına yerleştirmeyin veya bu alana doğru genişletmeyin. Çentik 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 kullanın. Durum çubuğu yüksekliğini sabit kodlamaktan kaçının. Bu, içeriklerin çakışmasına veya kesilmesine neden olabilir.

    Uygunsuz yerleşim ayarları nedeniyle üst kısmı kesilmiş içeriği gösteren bir resim
    Şekil 7. İçeriğin üst üste gelmesini veya kesilmesini önlemek için WindowInsetsCompat simgesini kullanın.
  • Uygulamanızın ne kadar pencere alanı kullandığını belirlemek için View.getLocationInWindow() simgesini kullanın. Uygulamanın pencerenin tamamını kullandığını varsaymayın ve View.getLocationOnScreen() simgesini kullanmayın.

  • Uygulamanızın tam ekran moduna geçmesi ve bu moddan çıkması gerekiyorsa always, shortEdges veya never kesme modlarını kullanın. Varsayılan kesme alanı davranışı, sistem çubukları varken uygulamanızdaki içeriğin kesme alanı içinde oluşturulmasına neden olabilir ancak bu durum tam ekran modunda geçerli değildir. 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 içeriğin yukarı ve aşağı hareket ettiğini gösteren bir resim.
    Şekil 8. Geçişler sırasında içeriğin yukarı ve aşağı hareket etmesi örneği.
  • Immersive modda, sinemaskop kullanıldığında uygulamanız ekranın tamamını kullanmadığından pencere ve ekran koordinatlarını kullanırken dikkatli olun. Letterbox nedeniyle ekran kaynağındaki koordinatlar, pencere kaynağındaki koordinatlarla aynı değildir. getLocationOnScreen() kullanarak ekran koordinatlarını gerektiği gibi görünümün koordinatlarına dönüştürebilirsiniz. Aşağıdaki resimde, içerik sinemaskop olduğunda koordinatların nasıl farklılaştığı gösterilmektedir:

    İçerik letterbox formatında olduğunda pencere ve ekran koordinatlarını gösteren bir resim.
    Şekil 9. İçerik letterbox formatındayken pencere ve ekran koordinatları
  • MotionEvent işlenirken benzer koordinat sorunlarını önlemek için MotionEvent.getX() ve MotionEvent.getY() kullanın. MotionEvent.getRawX() veya MotionEvent.getRawY() kullanmayın.

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

Uygulamanızın tüm ekranlarını ve deneyimlerini test edin. Mümkünse farklı türde kesiklere sahip cihazlarda test edin. Çentikli bir cihazınız yoksa Android 9 veya sonraki sürümlerin yüklü olduğu herhangi bir cihazda ya da emülatörde aşağıdaki adımları uygulayarak yaygın çentik yapılandırmalarını simüle edebilirsiniz:

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

    Emülatörde ekran kesiğinin nasıl simüle edileceğini gösteren resim
    Şekil 10. İçeriğinizin nasıl oluşturulduğunu test etmeye yönelik geliştirici seçenekleri.

Ek kaynaklar