Android uygulamaları, yalnızca dikey modda tutulan telefonlardan daha fazla form faktöründe çalışır. Pencereli görüntüleme, bağlı ekranlar ve katlanabilir cihazların kullanıma sunulmasıyla birlikte kamera uygulamanızın dinamik pencere boyutlarına, farklı en boy oranlarına ve harici donanımlara uyum sağlaması gerekiyor.
Telefon mantığı neden bozulur?
Kamera uygulamaları genellikle çok biçimli ortamlarda kritik hatalara neden olan varsayımlarda bulunur.
Doğal yön
- Varsayım: Cihazın doğal yönü
ROTATION_0her zaman dikey olmalıdır. - Gerçek: Tabletlerde, bazı katlanabilir cihazların iç ekranında ve masaüstü monitörlerinde
ROTATION_0genellikle yataydır. - Sonuç: Önizleme 90 derece hatalı şekilde döndürülüyor
Sensör hizalama
- Varsayım: Kamera sensörünün uzun kenarı, ekranın uzun kenarıyla aynı hizadadır.
- Gerçeklik: Yeniden boyutlandırılabilir bir pencere kare veya yatay olabilir ancak sensör sabit kalır (genellikle 4:3).
- Sonuç: Gerilmiş veya başka şekilde bozulmuş resimler
Ekran yoğunluğu ve boyutu
- Varsayım: Ekranın yoğunluğu ve boyutu çalışma zamanında değişmez.
- Gerçek: Masaüstü ortamlarında kullanıcılar pencereleri serbestçe yeniden boyutlandırır.
- Sonuç: Her sürükleme etkinliğinde kamera oturumunun yeniden başlatılması kullanıcı deneyimini kesintiye uğratır ve kilitlenmelere neden olabilir.
1. çözüm: Sistem amaçlarını kullanın
Uygulamanızın fotoğraf veya video çekmesi gerekiyorsa ancak özel bir kamera arayüzü gerekmiyorsa farklı form faktörlerini ele almanın en iyi yolu cihazın önceden yüklenmiş sistem kamerasını başlatmaktır (bkz. Kamera intent'leri).
Sistem amaçlarını kullanmak, tüm yakalama deneyimini cihazın orijinal ekipman üreticisi (OEM) tarafından geliştirilen kamera uygulamasına devreder. Bu, aşağıdakiler de dahil olmak üzere form faktörü desteğinin karmaşıklığını etkili bir şekilde dış kaynaklara aktarır:
- Yerleşik yeniden boyutlandırma ve döndürme desteği: Katlanabilir cihazlarda veya tabletlerdeki varsayılan kamera uygulaması, üretici tarafından özellikle bu cihazın geometrisini işlemek için geliştirilmiştir. Uygulama, cihaz katlandığında, döndürüldüğünde veya çoklu pencere moduna alındığında düzgün çalışacak şekilde tasarlanmıştır.
- Gelişmiş donanım özelliklerine erişim: OEM kamera uygulamaları, donanıma göre ayarlanmış algoritmalara (gece modu, HDR, belirli lens geçişi) özel erişime sahiptir. Bu algoritmaları manuel olarak kopyalamak zordur veya imkansızdır.
2. çözüm: Jetpack CameraX'i kullanın
CameraX, kamera uygulaması geliştirmeyi kolaylaştırmak için oluşturulmuş bir Jetpack kitaplığıdır. CameraX, yaşam döngüsüne duyarlı ve yüzeye yöneliktir. Bir cihaz katlandığında, döndürüldüğünde veya yeniden boyutlandırıldığında sensör yönünün ve yüzey boyutlarının manuel olarak yeniden hesaplanmasını gerektiren Camera2'nin aksine CameraX, çok pencereli yeniden boyutlandırma sırasında veya bir uygulama bağlı bir ekrana taşındığında kamera oturumlarının yeniden yapılandırılmasını otomatik olarak gerçekleştirir. Böylece önizleme akışının takılmadan veya gerilmeden uyarlanması sağlanır.
PreviewView gibi bileşenler, katlanabilir cihazın kapak ekranından iç ekrana geçişi gibi farklı durumlar için en-boy oranını ve ölçek türlerini akıllıca yönetir. Böylece, cihaza özel uç durumların karmaşık bir koleksiyonu yerine tek ve tutarlı bir uygulama ile çeşitli donanımları destekleyebilirsiniz.
Oluştur
Jetpack Compose ile özel androidx.camera:camera-compose kitaplığını kullanın. Kitaplık, Compose yaşam döngüsü içindeki yeniden boyutlandırma, döndürme ve en boy oranlarının karmaşık geometrisini işlemek için özel olarak tasarlanmış CameraXViewfinder composable'ını sağlar.
CameraXViewfinder bileşeni, kamera uygulamalarındaki en yaygın hata kaynaklarını ortadan kaldırır:
- Otomatik koordinat dönüşümü: Kamera uygulaması oluşturmanın en zor kısımlarından biri, kullanıcının dokunmasını (ekrandaki x, y koordinatları) odak ve ölçüm için kamera sensörünün koordinat sistemiyle (0-1, 0-1 döndürülmüş) eşlemektir.
CameraXViewfinder, pencere yeniden boyutlandırıldığında veya cihaz katlandığında bile matematik işlemlerini otomatik olarak yapan birCoordinateTransformersunar. - Doğru düzen davranışı:
SurfaceViewveyaTextureView'den farklı olarakCameraXViewfinder, Compose'un z-sıralamasıyla doğru şekilde çalışır. Kullanıcı arayüzü öğelerini (odak halkaları, kontroller) yerleştirebilir veya değiştiricileri (köşeleri yuvarlama, animasyonlar) oluşturma yapıtları olmadan uygulayabilirsiniz. - Yeniden boyutlandırma ve en boy oranı:
CameraXViewfinder, merkezi kırpma ve merkeze sığdırma mantığını dahili olarak işleyerek uygulama penceresi standart olmayan en boy oranlarında (ör. bölünmüş ekran veya pencereli görüntüleme modu) yeniden boyutlandırıldığında önizlemenin genişlemesini önler.
Görüntüleme sayısı
Görüntüleme tabanlı uygulamalarda PreviewView veya ViewFinderView simgesini kullanın. SurfaceView veya TextureView öğesini doğrudan kullanıyorsanız en-boy oranını hesaplamanız ve doğru dönüşüm matrisini kendiniz uygulamanız gerekir.
3. çözüm: Yönü ve yeniden boyutlandırmayı dinamik olarak işleme
Platform API'lerini doğrudan kullanırken cihaz döndürme, etkinlik yeniden başlatma ve en boy oranını göz önünde bulundurun.
Cihaz döndürmeyi durdurma
Kullanıcı arayüzü yerleşiminizi belirlemek için yalnızca Display#getRotation() veya fiziksel sensör yönlendirmesine güvenmeyin.
- Pencere metriklerini kullanma:
WindowManager#getCurrentWindowMetrics()kullanarak uygulama pencerenizin genişliğini ve yüksekliğini karşılaştırarak düzeninizi (yatay veya dikey kullanıcı arayüzü) belirleyin. - Doğal yönü yoksayma: Uygulamanız, yatay bir monitörde dikey şekilli bir pencerede olabilir. Cihaz yönü, kullanıcı arayüzü sınırlarınızla alakalı değildir.
Etkinliklerin yeniden başlatılmasını önleme
Varsayılan Android davranışı, yapılandırma değişikliklerinde (ör. pencere boyutu değiştirme) uygulamanızın etkinliğini bozar. Kamera uygulamalarında bu durum, ekranda titreme veya görüntülü görüşme sırasında bağlantının düşmesi şeklinde görünür.
- Manifest yapılandırması: Yeniden başlatmadan yeniden boyutlandırmayı işlemek için manifest dosyanızda yapılandırma değişikliklerini bildirin.
- Dinamik güncellemeler:
onConfigurationChanged()içinde, kamera önizlemenizin düzen parametrelerini yeni pencere boyutuna uyacak şekilde güncelleyin.
En boy oranı ve kırpma
Katlanabilir cihazlarda ve masaüstü pencerelerinde sık karşılaşılan bir sorun, önizlemenin gerilmesidir. Bu durumda, 4:3 kamera feed'i 16:9 veya 1:1 pencereye zorlanır.
- Genişletme: Önizleme ve pencere en boy oranları farklıysa kamera arabelleğini görünüm sınırlarıyla tam olarak eşleşmeye zorlamayın.
- Ortadan kırpma (önerilen): Önizlemeyi pencerenin en kısa boyutunu dolduracak şekilde ölçeklendirin ve fazlalığı kırpın. Bu sayede özne bozulmadan kalır ve çerçeveyi doldurur.
- Ortaya sığdır (alternatif): Tam görüş alanının gösterilmesi önemliyse (ör. belge tarama) önizlemeyi pencerenin içinde letterbox olarak gösterin.
Bonus: Katlanabilir cihazlara yönelik deneyimler için destek
Katlanabilir cihazlar, yalnızca bükülebilen telefonlar değildir. Ayrıca, kullanıcıların fotoğraf ve video çekme şeklini temelden iyileştirebilecek benzersiz donanım durumları sunar. Katlanabilir ekranı çözülmesi gereken bir sorun olarak ele almak yerine, katlanabilir olmayan cihazlarda mümkün olmayan özellikler oluşturmak için kullanın.
Masaüstü modu (ellerinizi kullanmadan çekim yapma)
Masaüstü modu, kullanıcıların cihazı yarıya katlayıp bir yüzeye yerleştirerek uzun süreli görüntülü görüşmeler yapmasına, hızlandırılmış çekimler ve uzun pozlama gece fotoğrafları çekmesine olanak tanır.
Arka ekran modu (yüksek kaliteli selfie'ler)
- Katlanabilir cihazlarda arka kameralar genellikle kullanıcıya dönük kameralardan daha yüksek kalitelidir. Arka ekran modu, kullanıcının cihazı açmasına ve çevirmesine olanak tanır. Bu modda, küçük kapak ekranı ana arka kamera için canlı vizör olarak kullanılır.
- Arka ekran modu, ek ekipman taşımanıza gerek kalmadan 50 MP ve üzeri çözünürlükte selfie'ler, ultra geniş grup çekimleri ve yüksek kaliteli vlog'lar çekmenizi sağlar.
Dual Screen modu (konu önizlemesi)
- Çift ekran modu, kamera önizlemesini hem iç hem de dış ekranda aynı anda göstermenizi sağlar. Bu özellik, insan fotoğrafları çekmek için idealdir: Fotoğrafını çektiğiniz kişiler, dış ekranda kendilerini görebilir ve siz iç ekranda kadrajı ayarlarken pozlarını düzeltebilir.
- Arka ekran modunun (tüm uygulamayı taşıyan) aksine, çift ekran modunda kapak ekranında ikincil bir sunu penceresi oluşturulur.