Üç katlı ve yatay katlanabilir cihazları destekleme

Kapalı ve tamamen açık konumda bir katlanabilir telefon ile kapalı ve tamamen açık konumda bir üç katlı telefon yan yana duruyor.

Geliştiriciler, katlanabilir cihazlar (özellikle Samsung Trifold veya yatay biçimde açılan orijinal Pixel Fold gibi cihazlar) için uygulama oluştururken genellikle benzersiz zorluklarla karşılaşır. Geliştirici hataları şunlardır:

  • Cihaz yönüyle ilgili yanlış varsayımlar
  • Gözden kaçan kullanım alanları
  • Yapılandırma değişiklikleri sırasında değerlerin yeniden hesaplanmaması veya önbelleğe alınmaması

Cihazla ilgili belirli sorunlar şunlardır:

  • Kapak ve iç ekranlar arasında cihazın doğal yönüyle ilgili bir uyuşmazlık (rotation_0 = dikey yönlendirme temel alınarak yapılan varsayımlar), uygulamaların katlama ve açma işlemlerinde başarısız olmasına neden oluyor
  • Farklı ekran yoğunlukları ve hatalı yoğunluk yapılandırma değişikliği işleme
  • Kamera sensörünün doğal yönlendirmeye bağlı olmasından kaynaklanan kamera önizleme sorunları

Katlanabilir cihazlarda yüksek kaliteli bir kullanıcı deneyimi sunmak için aşağıdaki önemli alanlara odaklanın:

  • Uygulamanın yönünü, cihazın fiziksel yönüne göre değil, uygulamanın kapladığı gerçek ekran alanına göre belirleyin.
  • Cihaz yönünü ve en-boy oranlarını doğru şekilde yönetmek, yan önizlemeleri önlemek ve görüntülerin uzatılmasını ya da kırpılmasını engellemek için kamera önizlemelerini güncelleyin.
  • ViewModel veya benzer yaklaşımlarla durumu koruyarak ya da ekran yoğunluğu ve yön değişikliklerini manuel olarak işleyerek cihaz katlama veya açma sırasında uygulama sürekliliğini koruyun. Bu sayede uygulama yeniden başlatılmaz veya durum kaybı yaşanmaz.
  • Hareket sensörlerini kullanan uygulamalarda, koordinat sistemini ekranın mevcut yönüne göre ayarlayın ve rotation_0 = portrait'e dayalı varsayımlardan kaçınarak hassas kullanıcı etkileşimleri sağlayın.

Uyarlanabilir derleme

Uygulamanız zaten uyarlanabilirse ve Uyarlanabilir uygulama kalite yönergelerinde belirtilen optimize edilmiş düzeye (2. Katman) uyuyorsa uygulama, katlanabilir cihazlarda iyi çalışır. Aksi takdirde, üç katlı ve yatay katlanabilir cihazlarla ilgili ayrıntıları tekrar kontrol etmeden önce aşağıdaki temel Android uyarlanabilir geliştirme kavramlarını inceleyin.

Uyarlanabilir düzenler

Kullanıcı arayüzünüz yalnızca farklı ekran boyutlarını değil, aynı zamanda en boy oranındaki gerçek zamanlı değişiklikleri (ör. katlanarak açılma ve çok pencereli veya masaüstü pencereli görüntüleme modlarına girme) de yönetmelidir. Aşağıdaki konularda daha fazla bilgi için Uyarlanabilir düzenler hakkında başlıklı makaleyi inceleyin:

  • Uyarlanabilir düzenler tasarlama ve uygulama
  • Uygulamanızın birincil gezinme sistemini pencere boyutuna göre ayarlama
  • Uygulamanızın kullanıcı arayüzünü uyarlamak için pencere boyutu sınıflarını kullanma
  • Jetpack API'lerini kullanarak liste-ayrıntı düzeni gibi standart düzenlerin uygulanmasını kolaylaştırın.
Açık bir katlanabilir cihazda uygulama, letterbox biçiminde gösteriliyor. Aynı uygulama, başka bir açık katlanabilir cihazda uyarlanabilir düzenle tam ekran olarak gösteriliyor.
Şekil 1. Uyarlanabilir olmayan (letterboxed) ve uyarlanabilir düzen arasındaki fark.

Pencere boyutu sınıfları

Yatay katlanabilir cihazlar ve üç katlı cihazlar da dahil olmak üzere katlanabilir cihazlar, kompakt, orta ve genişletilmiş pencere boyutu sınıfları arasında anında geçiş yapabilir. Bu sınıfları anlayıp uyguladığınızda uygulamanızın, mevcut cihaz durumuna göre doğru gezinme bileşenlerini ve içerik yoğunluğunu gösterdiğinden emin olursunuz.

Uygulamanın, kompakt, orta ve genişletilmiş pencere boyutu sınıflarına göre boyutlandırılmış cihazlardaki görünümü.
Şekil 2. Pencere boyutu sınıfları.

Aşağıdaki örnekte, önce currentWindowAdaptiveInfo() işlevi çağrılarak ve ardından üç pencere boyutu sınıfı için karşılık gelen düzenler kullanılarak uygulamanın ne kadar alan kullanabileceği belirlenmek üzere Material 3 uyarlanabilir kitaplığı kullanılmaktadır:

val adaptiveInfo = currentWindowAdaptiveInfo()
val windowSizeClass = adaptiveInfo.windowSizeClass

when {
  windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND) -> // Expanded
  windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND) -> // Medium
  else -> // Compact
}

Daha fazla bilgi için Pencere boyutu sınıflarını kullanma başlıklı makaleyi inceleyin.

Uyarlanabilir uygulama kalitesi

Uyarlanabilir uygulama kalitesi yönergelerinin 2. Katman (Uyarlanabilir optimize edilmiş) veya 1. Katman (Uyarlanabilir farklılaştırılmış)'ına uymak, uygulamanızın üç katlı cihazlarda, yatay katlanabilir cihazlarda ve diğer büyük ekranlı cihazlarda ilgi çekici bir kullanıcı deneyimi sunmasını sağlar. Yönergeler, uyarlanabilir deneyimden farklılaştırılmış deneyime geçmek için birden fazla katman düzeyinde kritik kontrolleri kapsar.

Android 16 ve sonraki sürümler

Android 16'yı (API düzeyi 36) ve sonraki sürümleri hedefleyen uygulamalarda sistem, en küçük genişliği >= 600 dp olan ekranlardaki yön, yeniden boyutlandırma ve en boy oranı kısıtlamalarını yoksayar. Uygulamalar, en boy oranı veya kullanıcının tercih ettiği yönlendirmeden bağımsız olarak ekran penceresinin tamamını doldurur ve letterboxing uyumluluk modu artık kullanılmaz.

Dikkat edilmesi gereken noktalar

Üç katlı ve yatay katlanabilir cihazlar, özellikle sensörler, kamera önizlemesi ve yapılandırma sürekliliği (katlama, açma veya yeniden boyutlandırma sırasında durumu koruma) ile ilgili olarak özel işlem gerektiren benzersiz donanım davranışları sunar.

Kamera önizleme

Yatay katlanabilir cihazlarda veya en-boy oranı hesaplamalarında (çoklu pencere, pencereli görüntüleme veya bağlı ekranlar gibi senaryolarda) sık karşılaşılan bir sorun, kamera önizlemesinin gerilmiş, yan, kırpılmış veya döndürülmüş şekilde görünmesidir.

Eşleşmeyen varsayımlar

Bu sorun genellikle büyük ekranlı ve katlanabilir cihazlarda görülür. Bunun nedeni, uygulamaların kamera özellikleri (ör. en-boy oranı ve sensör yönü) ile cihaz özellikleri (ör. cihaz yönü ve doğal yön) arasında sabit ilişkiler olduğunu varsayabilmesidir.

Yeni form faktörleri bu varsayıma meydan okuyor. Katlanabilir cihazlar, cihaz döndürülmeden görüntü boyutunu ve en boy oranını değiştirebilir. Örneğin, katlanabilir bir cihazı açmak en-boy oranını değiştirir ancak kullanıcı cihazı döndürmezse döndürme aynı kalır. Bir uygulama, en-boy oranının cihaz döndürmeyle ilişkili olduğunu varsayarsa kamera önizlemesini yanlış döndürebilir veya ölçeklendirebilir. Bir uygulama, kamera sensörünün yönünün dikey cihaz yönüyle eşleştiğini varsaydığında da aynı durum yaşanabilir. Bu durum, yatay katlanabilir cihazlar için her zaman geçerli değildir.

1. çözüm: Jetpack CameraX (En iyi)

En basit ve en sağlam çözüm, Jetpack CameraX kitaplığını kullanmaktır. PreviewView kullanıcı arayüzü öğesi, tüm önizleme karmaşıklıklarını otomatik olarak işleyecek şekilde tasarlanmıştır:

  • PreviewView sensör yönü, cihaz döndürme ve ölçeklendirme için doğru şekilde ayarlanır.
  • Genellikle ortalayarak ve kırparak (FILL_CENTER) kamera görüntüsünün en boy oranını korur.
  • Gerekirse önizlemeye mektup kutusu efekti uygulamak için ölçek türünü FIT_CENTER olarak ayarlayabilirsiniz.

Daha fazla bilgi için CameraX dokümanlarındaki Önizleme uygulama başlıklı makaleyi inceleyin.

2. çözüm: CameraViewfinder

Mevcut bir Camera2 kod tabanı kullanıyorsanız CameraViewfinder kitaplığı (API düzeyi 21 ile geriye dönük olarak uyumludur) başka bir modern çözümdür. TextureView veya SurfaceView kullanarak kamera feed'inin gösterilmesini basitleştirir ve gerekli tüm dönüşümleri (en-boy oranı, ölçek ve döndürme) sizin için uygular.

Daha fazla bilgi için Introducing Camera Viewfinder (Kamera Vizörünü Tanıtıyoruz) başlıklı blog yayınını ve Camera preview (Kamera önizlemesi) başlıklı geliştirici kılavuzunu inceleyin.

3. çözüm: Camera2'nin manuel olarak uygulanması

CameraX veya CameraViewfinder kullanamıyorsanız yönlendirmeyi ve en boy oranını manuel olarak hesaplamanız ve hesaplamaların her yapılandırma değişikliğinde güncellendiğinden emin olmanız gerekir:

  • CameraCharacteristics konumundan kamera sensörü yönünü (örneğin, 0, 90, 180, 270 derece) alın.
  • Cihazın mevcut ekran döndürme durumunu (örneğin, 0, 90, 180, 270 derece) alın.
  • SurfaceView veya TextureView için gerekli dönüşümleri belirlemek üzere bu iki değeri kullanın.
  • Bozulmayı önlemek için çıkışınızın en boy oranının Surface kamera önizlemesinin en boy oranıyla eşleştiğinden emin olun.
  • Kamera uygulaması, çoklu pencere veya pencereli görüntüleme modunda ya da bağlı bir ekranda ekranın bir bölümünde çalışıyor olabilir. Bu nedenle, ekran boyutu kamera vizörünün boyutlarını belirlemek için kullanılmamalıdır. Bunun yerine pencere metrikleri kullanılmalıdır.

Daha fazla bilgi için Kamera önizlemesi geliştirici kılavuzuna ve Farklı form faktörlerindeki kamera uygulamanız videosuna bakın.

4. Çözüm: Bir amaç kullanarak temel kamera işlemlerini gerçekleştirin

Çok fazla kamera özelliğine ihtiyacınız yoksa basit bir çözüm olarak cihazın varsayılan kamera uygulamasını kullanarak fotoğraf veya video çekme gibi temel kamera işlemlerini gerçekleştirebilirsiniz. Kamera kitaplığıyla entegrasyon yapmanız gerekmez. Bunun yerine Intent kullanın.

Daha fazla bilgi için Kamera amaçları konusuna bakın.

Yapılandırma ve süreklilik

Katlanabilir cihazlar kullanıcı arayüzünün çok yönlülüğünü artırır ancak katlanamayan cihazlara kıyasla daha fazla yapılandırma değişikliği başlatabilir. Uygulamanız, bu yapılandırma değişikliklerini ve bunların kombinasyonlarını (ör. cihazı döndürme, katlama/açma ve çok pencereli veya masaüstü modlarında pencereyi yeniden boyutlandırma) yönetmeli, aynı zamanda uygulama durumunu korumalı veya geri yüklemelidir. Örneğin, uygulamalar aşağıdaki sürekliliği sağlamalıdır:

  • Uygulama durumunu kilitlenmeden veya kullanıcılarda rahatsız edici değişikliklere neden olmadan koruma (örneğin, ekranlar arasında geçiş yaparken veya uygulamayı arka plana gönderirken)
  • Kaydırılabilir alanların kaydırma konumu
  • Metin alanlarına yazılan metin ve klavye durumu
  • Medya oynatma konumu. Böylece, yapılandırma değişikliği başlatıldığında oynatma kaldığı yerden devam eder.

Sık tetiklenen yapılandırma değişiklikleri arasında screenSize, smallestScreenSize, screenLayout, orientation, density, fontScale, touchscreen ve keyboard yer alır.

android:configChanges ve Yapılandırma değişikliklerini işleme başlıklı makalelere göz atın. Uygulama durumunu yönetme hakkında daha fazla bilgi için Kullanıcı arayüzü durumlarını kaydetme başlıklı makaleyi inceleyin.

Yoğunluk yapılandırma değişiklikleri

Üç katlı ve yatay katlanabilir cihazların dış ve iç ekranlarında farklı piksel yoğunlukları olabilir. Bu nedenle, density için yapılandırma değişikliğinin yönetilmesi ekstra dikkat gerektirir. Android, ekran yoğunluğu değiştiğinde etkinliği genellikle yeniden başlatır. Bu durum veri kaybına neden olabilir. Sistemin etkinliği yeniden başlatmasını önlemek için manifestinizde yoğunluk işlemeyi tanımlayın ve yapılandırma değişikliğini uygulamanızda programatik olarak yönetin.

AndroidManifest.xml yapılandırması

  • density: Uygulamanın ekran yoğunluğu değişikliğini işleyeceğini belirtir.
  • Diğer yapılandırma değişiklikleri: Sıkça yapılan diğer yapılandırma değişikliklerini de (ör. screenSize, orientation, keyboardHidden, fontScale vb.) belirtmeniz iyi olur.

Yoğunluğun bildirilmesi (ve diğer yapılandırma değişiklikleri), sistemin etkinliği yeniden başlatmasını engeller ve bunun yerine onConfigurationChanged() işlevini çağırır.

onConfigurationChanged() uygulaması

Yoğunluk değişikliği olduğunda, geri çağırma işlevinde kaynaklarınızı güncellemeniz gerekir (ör. yeniden yükleme bit eşlemleri veya düzen boyutlarını yeniden hesaplama):

  • DPI'nın newConfig.densityDpi olarak değiştiğini doğrulayın.
  • Özel görünümleri, özel çizilebilir öğeleri vb. yeni yoğunluğa sıfırlama

İşlenecek kaynak öğeler

  • Resim kaynağı: Yoğunluğa özgü kaynaklarla bit eşlemleri ve çizilebilirleri değiştirin veya ölçeği doğrudan ayarlayın.
  • Düzen birimi (dp - px dönüştürme): Görünüm boyutu, kenar boşluğu, dolgu yeniden hesaplama
  • Yazı tipi ve metin boyutu: sp birimi metin boyutunu yeniden uygulama
  • Özel View/Canvas çizimi: Canvas çizmek için kullanılan piksel tabanlı değerleri güncelleyin.

Uygulama yönünü belirleme

Uyarlanabilir bir uygulama oluştururken hiçbir zaman fiziksel cihaz döndürme özelliğine güvenmeyin. Bu özellik, büyük ekranlı cihazlarda yoksayılır ve çoklu pencere modundaki bir uygulamanın yönü cihazın yönünden farklı olabilir. Bunun yerine, uygulamanızın pencere boyutuna göre şu anda yatay mı yoksa dikey yönde mi olduğunu belirlemek için Configuration.orientation veya WindowMetrics'i kullanın.

1. çözüm: Configuration.orientation'ı kullanın

Bu özellik, uygulamanızın şu anda görüntülendiği yönü tanımlar.

2. çözüm: WindowMetrics#getBounds() kullanın

Uygulamanın mevcut görüntüleme sınırlarını alabilir ve yönü belirlemek için genişliğini ve yüksekliğini kontrol edebilirsiniz.

Uygulama yönünü büyük ekranlı cihazlarda değil de telefonlarda (veya katlanabilir cihazların dış ekranlarında) sınırlamanız gerekiyorsa Telefonlarda uygulama yönünü kısıtlama başlıklı makaleyi inceleyin.

Duruşlar ve ekran modları

Masaüstü ve HALF_OPENED gibi katlanabilir duruşlar ve durumlar hem dikey hem de yatay katlanabilir cihazlar tarafından desteklenir. Ancak üç katlı broşürler masa üstü duruşunu desteklemez ve HALF_OPENED kullanılamaz. Üç katlı cihazlar ise tamamen açıldığında benzersiz bir kullanıcı deneyimi için daha büyük bir ekran sunar.

HALF_OPENED destekleyen katlanabilir cihazlarda uygulamanızı farklılaştırmak için FoldingFeature gibi Jetpack WindowManager API'lerini kullanın.

Katlanabilir cihazlardaki duruşlar, durumlar ve kamera önizlemesi desteği hakkında daha fazla bilgi için aşağıdaki geliştirici kılavuzlarına göz atın:

Katlanabilir cihazlar benzersiz izleme deneyimleri sunar. Arka ekran modu ve çift ekran modu, katlanabilir cihazlar için arka kamera selfie önizlemesi ve iç ile dış ekranda eş zamanlı ancak farklı görüntüler gibi özel ekran özellikleri oluşturmanıza olanak tanır. Daha fazla bilgi için aşağıdaki kaynaklara göz atın:

Yönü doğal sensör yönüne kilitleme

Çok özel kullanım alanlarında (özellikle cihazın katlanmış durumuyla ilgisi olmayan, ekranın tamamını kaplaması gereken uygulamalarda) nosensor işareti, uygulamayı cihazın doğal yönüne kilitlemenize olanak tanır. Örneğin, Pixel Fold'da cihaz katlandığında doğal yön dikey, açıldığında ise yataydır. nosensor işaretinin eklenmesi, uygulama dış ekranda çalışırken dikey moda, iç ekranda çalışırken ise yatay moda kilitlenmeye zorlar.

<activity
  android:name=".MainActivity"
  android:screenOrientation="nosensor">

Oyunlar ve XR sensör yeniden eşleme

Oyunlar ve XR uygulamaları için ham sensör verileri (ör. jiroskop veya ivme ölçer) cihaz sabit koordinat sisteminde sağlanır. Kullanıcı, cihazı yatay olarak döndürerek oyun oynarsa sensör eksenleri ekranla birlikte dönmez ve oyun kontrolleri yanlış çalışır.

Bu sorunu düzeltmek için mevcut Display.getRotation() değerini kontrol edin ve eksenleri buna göre yeniden eşleyin:

  • 0. rotasyon: x=x, y=y
  • 90 derece döndürme: x=-y, y=x
  • 180 derece döndürme: x=-x, y=-y
  • 270 derece döndürme: x=y, y=-x

Dönüş vektörleri (pusula veya XR uygulamalarında kullanılır) için SensorManager.remapCoordinateSystem() kullanarak kamera lensi yönünü veya ekranın üst kısmını mevcut dönüşe göre yeni eksenlerle eşleyin.

Uygulama uyumluluğu

Uygulamalar, tüm form faktörleri ve bağlı ekranlarla uyumluluğu sağlamak için uygulama kalitesi yönergelerine uymalıdır. Bir uygulama yönergelere uyamıyorsa cihaz üreticileri, kullanıcı deneyimini olumsuz etkileyebilecek olsa da uyumluluk çözümleri uygulayabilir.

Ek bilgi için platformda sağlanan uyumluluk geçici çözümlerinin kapsamlı listesini inceleyin. Özellikle kamera önizlemesi, geçersiz kılmalar ve Android 16 API değişiklikleriyle ilgili olanları inceleyin. Bu değişiklikler, uygulamanızın davranışını değiştirebilir.

Uyarlanabilir uygulamalar geliştirme hakkında daha fazla bilgi edinmek için Uyarlanabilir uygulama kalitesi yönergeleri başlıklı makaleyi inceleyin.