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ın 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önlendirmeye dayalı 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ğımlılığı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ı veya kırpılmasını engellemek için kamera önizlemelerini güncelleyin.
ViewModelveya 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 = portreye göre varsayımlarda bulunmaktan kaçının. Böylece, kullanıcı etkileşimlerinin hassas olmasını sağlayabilirsiniz.
Uyarlanabilir derleme
Uygulamanız zaten uyarlanabilir ise ve Büyük ekranlı uygulamaların kalitesi yönergelerinde belirtilen optimize edilmiş düzeye (2. Katman) uyuyorsa katlanabilir cihazlarda iyi çalışır. Aksi takdirde, üç katlı ve yatay katlanabilir cihazların belirli ayrıntılarını 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. katlanma ve çoklu pencere veya masaüstü pencere 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ı gibi standart düzenlerin uygulanmasını kolaylaştırın.
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.
Aşağıdaki örnekte, Material 3 uyarlanabilir kitaplığı kullanılarak önce currentWindowAdaptiveInfo() işlevi çağrılır, ardından üç pencere boyutu sınıfı için karşılık gelen düzenler kullanılarak uygulamanın ne kadar alanının olduğu belirlenir:
val adaptiveInfo = currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)
val windowSizeClass = adaptiveInfo.windowSizeClass
when {
windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND) -> // Large
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.
Büyük ekran uygulama kalitesi
Büyük ekranlarda uygulama kalitesi yönergelerinin 2. Katman (Büyük ekran için optimize edilmiş) veya 1. Katman (Büyük ekran için 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 ekranlarda yön, yeniden boyutlandırılabilirlik 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, masaüstü pencereleme 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üş olarak 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 ekran 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 yönetmek üzere tasarlanmıştır:
PreviewViewsensör yönü, cihaz döndürme ve ölçeklendirme için doğru şekilde ayarlanır.- Genellikle ortalama ve kırpma (FILL_CENTER) yoluyla 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_CENTERolarak ayarlayabilirsiniz.
Daha fazla bilgi için CameraX belgelerindeki Ö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 başlıklı blog yayınını ve Camera preview 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 her yapılandırma değişikliğinde hesaplamaların güncellendiğinden emin olmanız gerekir:
CameraCharacteristicskonumundan 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.
SurfaceViewveyaTextureViewiç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
Surfacekamera önizlemesinin en boy oranıyla eşleştiğinden emin olun. - Kamera uygulaması, çoklu pencere veya masaüstü pencereli görüntüleme modunda ya da bağlı bir ekranda ekranın bir bölümünde çalışıyor olabilir. Bu nedenle, kamera vizörünün boyutlarını belirlemek için ekran boyutu 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: Amaç kullanarak temel kamera işlemlerini gerçekleştirme
Çok fazla kamera özelliğine ihtiyacınız yoksa basit ve anlaşılır 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 ve uygulama durumunu korumalı ya da 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 (ör. ekran değiştirirken veya uygulamayı arka plana gönderirken) neden olmadan koruma
- 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 bildirin 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 meydana gelen diğer yapılandırma değişikliklerini de (ör.
screenSize,orientation,keyboardHidden,fontScalevb.) bildirmeniz iyi olur.
Yoğunluğu (ve diğer yapılandırma değişikliklerini) bildirmek, 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ğırmada kaynaklarınızı güncellemeniz gerekir (ör. bit eşlemleri yeniden yükleme veya düzen boyutlarını yeniden hesaplama):
- DPI'nın
newConfig.densityDpiolarak değiştiğini doğrulayın. - Özel görünümleri, özel çizilebilirleri 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üşümü): Görünüm boyutunu, kenar boşluğunu ve dolguyu yeniden hesaplayın
- Yazı tipi ve metin boyutu: sp birimi metin boyutunu yeniden uygulama
- Özel
View/Canvasçizim: Çizim için kullanılan piksel tabanlı değerleri güncelleyinCanvas
Uygulama yönünü belirleme
Uyarlanabilir düzenler 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 çok pencereli moddaki 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ü telefonlarda (veya katlanabilir cihazların dış ekranlarında) sınırlamanız ancak büyük ekranlı cihazlarda sınırlamamanı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ı kapaklar, masa üstü duruşunu desteklemez ve HALF_OPENED kullanılamaz. Üç katlı katlanabilir 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 edinmek 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 özel ekran özellikleri (ör. arka kamera selfie önizlemesi ve iç ile dış ekranda eş zamanlı ancak farklı ekranlar) oluşturmanıza olanak tanır. Daha fazla bilgi için aşağıdaki kaynaklara bakı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) cihazla sabit koordinat sisteminde sağlanır. Kullanıcı, cihazı yatay olarak döndürerek oyun oynarsa sensör eksenleri ekranla birlikte dönmez ve bu durum, oyun kontrollerinin yanlış olmasına neden olur.
Bu sorunu düzeltmek için mevcut Display.getRotation() değerini kontrol edin ve eksenleri buna göre yeniden eşleyin:
- Dönüş 0: 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ı ekranlarda uyumluluğu garanti etmek 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 bilgiler için platformda sağlanan uyumluluk geçici çözümlerinin kapsamlı listesini inceleyin. Özellikle de 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 Büyük ekranlarda uygulama kalitesi başlıklı makaleyi inceleyin.