Bu konuda, uygulamanızın içinde CameraX kullanım alanlarının nasıl ayarlanacağı
veya resimlerden, doğru rotasyon bilgisine sahip
ImageAnalysis
veya ImageCapture
kullanım alanı. Yani:
ImageAnalysis
kullanım alanınınAnalyzer
, bakın.ImageCapture
kullanım alanı, resimleri doğru döndürerek çekmelidir.
Terminoloji
Bu konuda aşağıdaki terminoloji kullanılır, dolayısıyla her terimin ne anlama geldiğini anlamak önemlidir:
- Ekran yönü
- Bu, cihazın hangi tarafının yukarı konumda olduğunu ifade eder ve şu dört değerden biri: dikey, yatay, ters dikey veya ters kullanabilirsiniz.
- Ekran döndürme
- Bu,
Display.getRotation()
ve cihazın saat yönünün tersine döndürülme derecesini gösterir çok önemli bir yer tutar. - Hedef rotasyon
- Bu, döndürme için kaç derece geçeceğini gösterir saat yönünde hareket ettirmeniz gerekir.
Hedef rotasyonu belirleme
Aşağıdaki örneklerde bir cihaz için hedef rotasyonun nasıl belirleneceği gösterilmektedir bir bıçak işaretidir.
1. Örnek: Dikey doğal yön
Cihaz örneği: Pixel 3 XL | |
---|---|
Doğal yön = Dikey Ekran rotasyonu = 0 |
|
Doğal yön = Dikey Ekran rotasyonu = |
2. Örnek: Yatay doğal yön
Cihaz örneği: Pixel C | |
---|---|
Doğal yön = Yatay Ekran rotasyonu = 0 |
|
Doğal yön = Yatay Ekran rotasyonu = 270 |
Resim döndürme
Hangi uçta? Android'de sensör yönü sabit olarak tanımlanır değeri (0, 90, 180, 270) temsil eden değer üst tarafından bir köşeye alınır. Tüm resimlerde gösterildiği gibi, resim rotasyonunda verilerin nasıl olması saat yönünde döndürüldü.
Aşağıdaki örneklerde, resim rotasyonunun kamera sensörünün yönü. Ayrıca hedef rotasyonun ekran döndürme.
1. Örnek: Sensör 90 derece döndürüldü
Cihaz örneği: Pixel 3 XL | |
---|---|
Ekran rotasyonu = 0 |
|
Ekran rotasyonu = |
2. Örnek: Sensör 270 derece döndürüldü
Cihaz örneği: Nexus 5X | |
---|---|
Ekran rotasyonu = 0 |
|
Ekran rotasyonu = |
3. Örnek: Sensör 0 derece döndürüldü
Cihaz örneği: Pixel C (Tablet) | |
---|---|
Ekran rotasyonu = 0 |
|
Ekran rotasyonu = 270 |
Resmin dönüşünü hesaplama
Görüntü Analizi
ImageAnalysis
adlı çocuğun Analyzer
cihazı, kameradan şu şekilde görüntü alır:
ImageProxy
sn. Her resim, erişilebilir durumda olan döndürme bilgilerini içerir
şu yolla:
val rotation = imageProxy.imageInfo.rotationDegrees
Bu değer, resmin döndürülmesi gereken dereceyi gösterir
saat yönünde, ImageAnalysis
adlı reklamın hedef rotasyonuyla eşleşecek şekilde ayarlayın. Şu bağlamda:
Android uygulamasında, ImageAnalysis
adlı reklamverenin hedef rotasyonu genellikle
ekranın yönünü değiştirebilirsiniz.
Resim Yakalama
Yakalama olduğunda sinyal vermek için ImageCapture
örneğine geri çağırma eklenir
hazır. Sonuç, yakalanan görüntü veya bir hata olabilir.
Fotoğraf çekerken sağlanan geri çağırma şunlardan biri olabilir: türler:
OnImageCapturedCallback
: Bellek içi erişimi olan bir görüntü alır. birImageProxy
biçiminde dışa aktarabilirsiniz.OnImageSavedCallback
: Çekilen görüntü çekildiğinde çağrılır belirtilen konumda başarılı bir şekilde depolandıImageCapture.OutputFileOptions
. Seçenekler birFile
, birOutputStream
veyaMediaStore
bölgesinde bir konum.
Biçimi ne olursa olsun (ImageProxy
,
File
, OutputStream
, MediaStore Uri
), döndürme derecesini
Çekilen görüntünün ImageCapture
adlı saatin yönüyle eşleşmesi için saat yönünde döndürülmesi
Android uygulaması bağlamında genellikle
ekranın yönüyle eşleşiyor.
Yakalanan görüntünün döndürme işlemi aşağıdakilerden biri kullanılarak yapılabilir: yöntemler:
ImageProxy
val rotation = imageProxy.imageInfo.rotationDegrees
File
val exif = Exif.createFromFile(file) val rotation = exif.rotation
OutputStream
val byteArray = outputStream.toByteArray() val exif = Exif.createFromInputStream(ByteArrayInputStream(byteArray)) val rotation = exif.rotation
MediaStore uri
val inputStream = contentResolver.openInputStream(outputFileResults.savedUri) val exif = Exif.createFromInputStream(inputStream) val rotation = exif.rotation
Resmin dönüşünü doğrulama
ImageAnalysis
ve ImageCapture
kullanım alanları ImageProxy
kamera. ImageProxy
, resmi sarmalar ve
hakkında bilgiler içerir. Bu rotasyon bilgileri
resmin kullanımla eşleşmesi için döndürülmesi gereken dereceyi gösterir
durumun hedef rotasyonunu belirler.
ImageCapture/ImageAnalysis hedef döndürme yönergeleri
Çoğu cihaz dikey yönde veya ters yatay yönde varsayılan olarak bazı Android uygulamaları bu yönleri desteklemez. Uygulama olup olmadığı kullanım alanlarının hedef rotasyonunun güncellendi.
Aşağıda, kullanım alanlarının hedef rotasyonunun nasıl senkronize tutulacağını tanımlayan iki tablo yer almaktadır değişiklik yapabilirsiniz. İlki, proje yaşam döngüsü boyunca dört farklı yön var. ikincisi yalnızca cihazın döndürdüğü yönleri işliyor olarak ayarlayacağım.
Uygulamanızda hangi yönergeleri uygulayacağınızı seçmek için:
Uygulamanızın kamerasının (
Activity
) kilitli, yönlü veya yön yapılandırma değişikliklerini geçersiz kılıp kılmadığını kontrol edin.Uygulamanızın kamerasının (
Activity
) dört cihazı da kullanıp kullanamayacağına karar verin yönler (dikey, ters dikey, yatay ve ters yatay), veya yalnızca çalıştırıldığı cihazın desteklediği yönlere varsayılan olarak.
Dört yönü de destekleyin
Bu tabloda, cihazın aşağıdaki durumlarda uyulması gereken ters portreye döndürülmez. Aynı uygulama, yatay olarak döndürmeyin.
Senaryo | Kurallar | Tek pencere modu | Birden fazla pencereli bölünmüş ekran modu |
---|---|---|---|
Kilidi açılmış yön |
Her bir kullanım alanını ayarlayın
Activity oluşturulduğu zaman; örneğin
Activity adlı kullanıcının onCreate() geri araması.
|
||
OrientationEventListener hesabını kullan
onOrientationChanged()
Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin. Bu işlem, sistemin
bir yön değişikliğinden sonra bile Activity öğesini yeniden oluşturmak
döndürüldüğünde ortaya çıkar.
|
Ekran ters çevrildiğinde de ayarlanır dikey yöne döndüğünde ve cihaz ters dikey yönde varsayılandır. |
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında
|
|
İsteğe bağlı: Activity için screenOrientation ayarlayın
fullSensor mülkü için AndroidManifest içinde
dosyası olarak kaydedebilirsiniz.
|
Bu şekilde, cihaz ters çevrildiğinde kullanıcı arayüzü dik konumda olur
ve Activity öğesinin, Search Ads 360 tarafından yeniden oluşturulmasına olanak
cihaz 90 derece döndürüldüğünde sisteme geçiş yapılır.
|
Dikey yöne doğru döndürmeyen cihazlarda varsayılandır. Ekran şuradayken çoklu pencere modu desteklenmez: Ters dikey yönde. | |
Kilitli yön |
Kullanım alanlarını
Activity ilk olarak oluşturulur. Örneğin, Activity
onCreate() geri arama.
|
||
OrientationEventListener hesabını kullan
onOrientationChanged()
Geri çağırmanın içinde, Önizleme dışındaki kullanım alanlarının hedef rotasyonunu güncelleyin.
|
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında
|
||
Yön yapılandırmaları geçersiz kılındı |
Kullanım alanlarını
Activity ilk olarak oluşturulur. Örneğin, Activity
onCreate() geri arama.
|
||
OrientationEventListener hesabını kullan
onOrientationChanged()
Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin.
|
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında
|
||
İsteğe bağlı: Etkinliğin screenOrientation özelliğini şurada fullSensor olarak ayarlayın: AndroidManifest dosyasına göz atın. | Cihaz ters dikey durumdayken kullanıcı arayüzünün dik konumda olmasını sağlar. | Dikey yöne doğru döndürmeyen cihazlarda varsayılandır. Ekran şuradayken çoklu pencere modu desteklenmez: Ters dikey yönde. |
Yalnızca cihaz tarafından desteklenen yönleri destekleme
Yalnızca cihazın varsayılan olarak desteklediği yönleri destekleme ters dikey/ters yatay).
Senaryo | Kurallar | Birden fazla pencereli bölünmüş ekran modu |
---|---|---|
Kilidi açılmış yön |
Her bir kullanım alanını ayarlayın
Activity oluşturulduğu zaman; örneğin
Activity adlı kullanıcının onCreate() geri araması.
|
|
DisplayListener hesabını kullan
onDisplayChanged() İç mekan
kullanım alanlarının hedef rotasyonunu güncelleyin. Örneğin,
cihaz 180 derece döndürüldü.
|
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında
|
|
Kilitli yön |
Kullanım alanlarını
Activity ilk olarak oluşturulur. Örneğin, Activity
onCreate() geri arama.
|
|
OrientationEventListener hesabını kullan
onOrientationChanged()
Geri çağırmanın içinde, kullanım alanlarının hedef rotasyonunu güncelleyin.
|
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında cihazlar.
|
|
Yön yapılandırmaları geçersiz kılındı |
Kullanım alanlarını
Activity ilk olarak oluşturulur. Örneğin, Activity
onCreate() geri arama.
|
|
DisplayListener hesabını kullan
onDisplayChanged() İç mekan
kullanım alanlarının hedef rotasyonunu güncelleyin. Örneğin,
cihaz 180 derece döndürüldü.
|
Ayrıca, Activity öğesinin
cihaz döndüğünde yeniden oluşturulur (örneğin, 90 derece). Bu işlemin gerçekleştirileceği yer:
Uygulama ekranın yarısını kapladığında küçük form faktörlü cihazlarda ve daha büyük cihazlarda
uygulama ekranın üçte ikisini kapladığında
|
Kilidi açık yön
Activity
, ekran yönü kilitsiz olan bir yöne sahip
(ör. dikey veya yatay), cihazın fiziksel yönüyle uyumlu
bazı cihazların desteklemediği ters dikey/yatay
varsayılan olarak. Cihazı dört yönde de dönmeye zorlamak için
Activity
adlı çocuğun screenOrientation
mülkü fullSensor
adlı kullanıcıya.
Çoklu pencere modunda, ters dikey/yatay görünümü desteklemeyen bir cihaz
varsayılan olarak ters dikey/yatay düzende döndürülmez,
screenOrientation
özelliği fullSensor
olarak ayarlandı.
<!-- The Activity has an unlocked orientation, but might not rotate to reverse portrait/landscape in single-window mode if the device doesn't support it by default. --> <activity android:name=".UnlockedOrientationActivity" /> <!-- The Activity has an unlocked orientation, and will rotate to all four orientations in single-window mode. --> <activity android:name=".UnlockedOrientationActivity" android:screenOrientation="fullSensor" />
Kilitli yön
Bir ekranın yönü aynı kalırken kilitleniyor
(ör. dikey veya yatay)
olanak tanır. Bu işlem, Activity
için screenOrientation
belirtilerek yapılabilir
özelliğini AndroidManifest.xml
dosyasındaki beyanında bulabilirsiniz.
Ekran yönü kilitlendiyse sistem, ekranı imha etmez ve
Cihaz döndürülürken Activity
öğesini yeniden oluşturabilirsiniz.
<!-- The Activity keeps a portrait orientation even as the device rotates. --> <activity android:name=".LockedOrientationActivity" android:screenOrientation="portrait" />
Yön yapılandırması değişiklikleri geçersiz kılındı
Activity
yön yapılandırması değişikliklerini geçersiz kıldığında sistem
Cihazın fiziksel yönü değiştiğinde resmi yok edip yeniden oluşturmaz.
Yine de sistem, kullanıcı arayüzünü cihazın fiziksel yönüyle eşleşecek şekilde günceller.
<!-- The Activity's UI might not rotate in reverse portrait/landscape if the device doesn't support it by default. --> <activity android:name=".OrientationConfigChangesOverriddenActivity" android:configChanges="orientation|screenSize" /> <!-- The Activity's UI will rotate to all 4 orientations in single-window mode. --> <activity android:name=".OrientationConfigChangesOverriddenActivity" android:configChanges="orientation|screenSize" android:screenOrientation="fullSensor" />
Kamera kullanım alanları kurulumu
Yukarıda açıklanan senaryolarda kamera kullanım alanları,
İlk olarak Activity
oluşturuldu.
Yönü kilitsiz olan bir Activity
için bu kurulum yapılır
cihaz her döndürüldüğünde; sistem, öğeyi imha edip yeniden
Yön değişiklikleriyle ilgili Activity
. Bu nedenle, belirli bir hedefin değeri için
varsayılan olarak her defasında ekranın yönüyle eşleşecek şekilde hedef döndürmeyi ayarlar.
Yönü kilitli veya yönü geçersiz olan Activity
yön yapılandırması değiştiğinde bu kurulum, Activity
oluşturulmalıdır.
class CameraActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val cameraProcessFuture = ProcessCameraProvider.getInstance(this) cameraProcessFuture.addListener(Runnable { val cameraProvider = cameraProcessFuture.get() // By default, the use cases set their target rotation to match the // display’s rotation. val preview = buildPreview() val imageAnalysis = buildImageAnalysis() val imageCapture = buildImageCapture() cameraProvider.bindToLifecycle( this, cameraSelector, preview, imageAnalysis, imageCapture) }, mainExecutor) } }
OrientationEventListener kurulumu
OrientationEventListener
kullanmak, hedefi sürekli olarak güncellemenize olanak tanır
cihaz yönünün değişmesine bağlı olarak kamera kullanım alanlarının
dönmesini de sağlayabilir.
class CameraActivity : AppCompatActivity() { private val orientationEventListener by lazy { object : OrientationEventListener(this) { override fun onOrientationChanged(orientation: Int) { if (orientation == ORIENTATION_UNKNOWN) { return } val rotation = when (orientation) { in 45 until 135 -> Surface.ROTATION_270 in 135 until 225 -> Surface.ROTATION_180 in 225 until 315 -> Surface.ROTATION_90 else -> Surface.ROTATION_0 } imageAnalysis.targetRotation = rotation imageCapture.targetRotation = rotation } } } override fun onStart() { super.onStart() orientationEventListener.enable() } override fun onStop() { super.onStop() orientationEventListener.disable() } }
DisplayListener kurulumu
DisplayListener
kullanmak, kameranın hedef dönüşünü güncellemenize olanak tanır
kullanım alanları (örneğin, sistemin mevcut paketinizi kaldırmadığı
ve cihaz 180 derece döndürüldükten sonra Activity
öğesini yeniden oluşturun.
class CameraActivity : AppCompatActivity() { private val displayListener = object : DisplayManager.DisplayListener { override fun onDisplayChanged(displayId: Int) { if (rootView.display.displayId == displayId) { val rotation = rootView.display.rotation imageAnalysis.targetRotation = rotation imageCapture.targetRotation = rotation } } override fun onDisplayAdded(displayId: Int) { } override fun onDisplayRemoved(displayId: Int) { } } override fun onStart() { super.onStart() val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager displayManager.registerDisplayListener(displayListener, null) } override fun onStop() { super.onStop() val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager displayManager.unregisterDisplayListener(displayListener) } }