Not: Bu sayfa Kamera2 paketiyle ilgilidir. Uygulamanız için Kamera2'nin belirli, alt düzey özellikleri gerekmiyorsa, KameraX'i kullanmanızı öneririz. Hem CameraX hem de Camera2, Android 5.0 (API düzeyi 21) ve sonraki sürümleri destekler.
Kameralar ve kamera önizlemelerinin yönü Android'de her zaman aynı olmuyor cihazlar.
Kamera, cihazın konum belirlemeden bağımsız olarak cihaz üzerinde sabit bir konumda telefon, tablet veya bilgisayar. Cihazın yönü değiştiğinde kamera yönü değişiklikleri.
Sonuç olarak, kamera uygulamaları genellikle kameralar ve videolar arasında cihazın yönü ve kamera önizlemesinin en boy oranı. Bir telefon dikey yöndeyse kamera önizlemesinin daha uzun olduğu varsayılır emin olmanız gerekir. Telefon (ve kamera) yatay olarak döndürüldüğünde, kamera önizlemesinin uzunluk değerinden daha geniş olması beklenir.
Ancak katlanabilir cihaz (ör. katlanabilir cihaz) gibi yeni form faktörleri, bu varsayımları çürütmektedir. cihazlar ve görüntü modları örneğin: çoklu pencere ve çoklu ekran. Katlanabilir cihazlar, ekran boyutunu ve en boy oranını değiştirmeden değiştirir. Yönü. Çoklu pencere modu, kamera uygulamalarını ekranın bir kısmıyla kısıtlar. cihaz yönünden bağımsız olarak kamera önizlemesini ölçeklendirin. Çoklu ekran modu, ikincil ekranların kullanılmasını mümkün kılar. birincil ekranla aynı yönde olmalıdır.
Kamera yönü
İlgili içeriği oluşturmak için kullanılan Android Uyumluluğu Tanımı kamera görüntü sensörünün "uzun kameranın görüntü sensörüne boyutu ekranın uzun boyutuyla uyumlu. Yani, Cihaz yatay yönde tutulmalıdır, kameraların resimleri yatay yönde. Bu, cihazın doğal yapısından bağımsız olarak yön; yani yatay birincil cihazlar için de geçerlidir. dikey-birincil cihazlar" olarak ayarlanmıştır.
Kameradan ekrana yerleştirme düzeni, kameranın görüntüleme alanını en üst düzeye çıkarır. kamera uygulamasındaki vizör. Ayrıca görüntü sensörleri, verilerini genelde yatay en boy oranları ve 4:3 en yaygın kullanılan orandır.
![Telefon ve kamera sensörü dikey yönde.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_preview_portrait_front_facing.png?authuser=8&hl=tr)
Kamera sensörünün doğal yönü yataydır. Şekil 1'de sensör (kamera ile aynı yönü gösteren) ekrana göre 270 derece döndürülür. Android Uyumluluk Tanımı.
Sensör dönüşünü uygulamalara göstermek için
camera2 API'si bir
SENSOR_ORIENTATION
sabittir. Çoğu telefon ve tablette cihaz, sensör yönünü bildirir
270 derece ve 90 derecelik açıyı (ör.
arkasına doğru bakan kameralar için (cihazın uzun kenarı) hizalayın.
bir sensöre dokunun. Dizüstü kameralar genellikle
sensör yönü 0 veya 180 derece olmalıdır.
Çünkü kamera görüntüsü sensörleri
yönünde (yatay) döndürüldüğünde, görüntü arabelleğinin döndürüldüğü
kamera önizlemesinin SENSOR_ORIENTATION
tarafından belirtilen derece sayısı
cihazın doğal yönünde dik bir şekilde görünür. Ön kameralarda
döndürme saat yönünün tersinedir; kameralar için saat yönünde.
Örneğin, Şekil 1'deki ön kamera için resim arabelleği aşağıdaki gibi görünür:
![Kamera sensörü resimle birlikte yatay yönde döndürüldü
yana doğru, sol üstte.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_portrait_rotated_90.png?authuser=8&hl=tr)
Önizlemenin doğru şekilde ayarlanması için resim saat yönünün tersine 270 derece döndürülmelidir. yön, cihazın yönüyle eşleşiyor:
![Dikey yönlü kamera sensörü ve resim dik konumda.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_portrait_without_coordinates.png?authuser=8&hl=tr)
Arka yüz kamerası aynı yönde bir resim arabelleği üretir
aynı fakat SENSOR_ORIENTATION
90 derecedir. Sonuç olarak
arabellek saat yönünde 90 derece döndürüldü.
Cihaz döndürme
Cihaz dönüşü, cihazın doğal konumundan döndürülme derecesidir. Yönü. Örneğin, yatay yönde bir telefonda, 90 veya 270 derece döndürebilirsiniz.
Kamera sensörü görüntü arabelleği ile için cihaz döndürme (sensör yönü derecelerine ek olarak) kamera önizlemesinin dik durmasına yardımcı olur.
Yön hesaplaması
Kamera önizlemesinin doğru yönü, sensörü dikkate alır cihaz yönünü ve cihaz döndürmeyi gösterir.
Sensör görüntüsü arabelleğinin genel dönüşü şu formülle başlayalım:
rotation = (sensorOrientationDegrees - deviceOrientationDegrees * sign + 360) % 360
Burada sign
ön kamera için 1
, arka kameralar için -1
şeklindedir.
Ön kameralarda resim arabelleği saat yönünün tersine döndürülür ( sensörün doğal yönü). Arka kameralarda sensör resim arabelleği saat yönünde döndürüldü.
deviceOrientationDegrees * sign + 360
ifadesi, cihaz rotasyonunu dönüştürür
arka kameralar için saat yönünün tersine saat yönünün tersine (örneğin,
saat yönünün tersine 270 dereceyi 90 dereceye dönüştürme). Modül
işlemi, sonucu 360 derecenin altına ölçeklendirir (örneğin, 540 derece veya
180 derece olacak şekilde).
Farklı API'ler, cihaz rotasyonunu farklı şekilde bildirir:
Display#getRotation()
cihazın saat yönünün tersine dönmesini sağlar (kullanıcının bulunduğu yerden görünür). Bu değer, yukarıdaki formüle olduğu gibi eklenir.OrientationEventListener#onOrientationChanged()
cihazın saat yönünde dönüşünü döndürür (kullanıcının bakış açısından). Yukarıdaki formülde kullanılacak değeri yok sayın.
Ön kameralar
![Hem yatay yönde hem de sensörde kamera önizlemesi ve sensör
sağ tarafta.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_preview_landscape_counterclockwise_front_facing.png?authuser=8&hl=tr)
Şekil 2'de kamera sensörü tarafından üretilen görüntü arabelleğini görebilirsiniz:
![Yatay yönlü ve görüntü dik konumda olan kamera sensörü.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape.png?authuser=8&hl=tr)
Sensörü ayarlamak için arabelleğin saat yönünün tersine 270 derece döndürülmesi gerekir yön (yukarıdaki Kamera yönü konusuna bakın):
![Kamera sensörü, görüntü yan olacak şekilde dikey yönde döndürüldü,
sağ üstte.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_rotated_270.png?authuser=8&hl=tr)
Daha sonra, arabellek saat yönünün tersine 90 derece daha döndürülür. cihazın yönünü de hesaba katarak kameranın yönünün doğru olmasını sağlayın. kamera önizlemesi:
![Kamera sensörü resimle birlikte yatay yönde döndürüldü
dik.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_without_coordinates.png?authuser=8&hl=tr)
Burada, kamera sağa ve yatay yöne çevrilmiş halde gösterilmiştir:
![Hem kamera önizlemesi hem de sensör yatay yönde ancak
sensör ters dönmüş.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_preview_landscape_clockwise_front_facing.png?authuser=8&hl=tr)
Resim arabelleğini burada görebilirsiniz:
![Kamera sensörü, görüntü ters olacak şekilde yatay yönde döndürüldü
aşağı tüketim.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_clockwise.png?authuser=8&hl=tr)
Sensöre göre tampon, saat yönünün tersine 270 derece döndürülmelidir yön:
![Görüntü yan, dikey yönde olarak derecelendirilen kamera sensörü
tıklayın.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_clockwise_rotated_270.png?authuser=8&hl=tr)
Daha sonra, arabellek saat yönünün tersine 270 derece daha döndürülür. cihaz döndürme:
![Kamera sensörü resimle birlikte yatay yönde döndürüldü
dik.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_without_coordinates.png?authuser=8&hl=tr)
Arka kameralar
Arkaya bakan kameraların sensör yönü 90 derecedir (örn., arka tarafından görüntülenir). Kamera önizlemesinin yönünü değiştirirken sensör görüntüsü arabelleği, sensör dönüş miktarı kadar saat yönünde döndürülür yerine (ön kameralarda olduğu gibi saat yönünün tersine) döndürerek arabellek, cihaz döndürme miktarı kadar saat yönünün tersine döndürülür.
![Hem kamera önizlemesi hem de sensör yatay yönde ancak
sensör ters dönmüş.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_preview_landscape_clockwise_back_facing.png?authuser=8&hl=tr)
Şekil 4'te kamera sensöründen gelen görüntü arabelleğini aşağıda görebilirsiniz:
![Kamera sensörü, görüntü ters olacak şekilde yatay yönde döndürüldü
aşağı tüketim.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_clockwise.png?authuser=8&hl=tr)
Arabellek, sensörü ayarlamak için saat yönünde 90 derece döndürülmelidir yön:
![Görüntü yan, dikey yönde olarak derecelendirilen kamera sensörü
tıklayın.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_clockwise_rotated_270.png?authuser=8&hl=tr)
Daha sonra arabellek, cihazı hesaba katmak için saat yönünün tersine 270 derece döndürülür rotasyon:
![Kamera sensörü resimle birlikte yatay yönde döndürüldü
dik.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/camera_sensor_landscape_without_coordinates.png?authuser=8&hl=tr)
En boy oranı
Ekran en boy oranı, cihaz yönü değiştiğinde ancak aynı zamanda katlanabilir ürünler, pencereler çoklu pencerede yeniden boyutlandırıldığında katlanabilir ve açılır ortamlarda ve uygulamaların ikincil ekranlarda ne zaman açıldığını gösterir.
Kamera sensörü görüntü tamponu, kullanıcı arayüzü olarak vizör kullanıcı arayüzü öğesinin yönü ve en boy oranı yönü dinamik olarak değiştirir (cihaz değişmeden veya değişmeden) Yönü.
Yeni form faktörlerinde veya çoklu pencereli ya da çoklu görüntülü ortamlarda, Uygulama, kamera önizlemesinin cihazla aynı yöne sahip olduğunu varsayar (dikey veya yatay) önizlemenizin yönü yanlış veya ölçeklendirilmiş olabilir veya her ikisini birden kontrol edebilirsiniz.
![Dikey kamera önizlemesi açılmış katlanmamış katlanabilir cihaz
yanar.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/foldable_with_rotation_problem.png?authuser=8&hl=tr)
Şekil 5'te uygulama yanlışlıkla cihazın 90 derece döndürüldüğünü varsaymıştır derece saat yönünün tersine; Dolayısıyla uygulama, önizlemeyi aynı miktarda döndürdü.
![Kamera önizleme dik ancak basılmış olan katlanmamış katlanabilir cihaz
yanlış ölçeklendirmeden kaynaklanır.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/foldable_with_scaling_problem.png?authuser=8&hl=tr)
Şekil 6'da, uygulama görüntü arabelleğinin en boy oranını kamera önizleme kullanıcı arayüzünün yeni boyutlarına uyacak şekilde uygun şekilde ölçeklendirilmesini sağlamak öğesine dokunun.
Sabit yönlü kamera uygulamaları katlanabilir cihazlarda genellikle dizüstü bilgisayar gibi diğer büyük ekranlı cihazlar:
![Dizüstü bilgisayarda kamera önizlemesi dik, uygulamanın kullanıcı arayüzü yan duruyor.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_camera_preview_fixed-orientation_app.png?authuser=8&hl=tr)
Şekil 7'de, uygulama yönü durduğu için kamera uygulamasının kullanıcı arayüzü yan yatmıştır. sadece dikey modda kullanılabilir. Vizör görüntüsü doğru yönde göre değişir.
İçe doğru dikey mod
Çoklu pencere modunu desteklemeyen kamera uygulamaları
(resizeableActivity="false"
)
ve yönlerine kısıtlama getirmek
(screenOrientation="portrait"
)
veya screenOrientation="landscape"
)
büyük ekranlı cihazlarda dikey yönde yerleştirilebilir
kamera önizlemesi.
Yalnızca dikey modda kullanılan dikey mod sinemaskoplar (içe aktarmalı) uygulamalar ekran en boy oranı yatay olsa bile yönlendirilir. Yalnızca yatay uygulamalar yatay yönde olsa da sinemaskop efektiyle ekranın en boy oranı dikey. Kamera resmi hizalanması için döndürüldü uygulamanın kullanıcı arayüzüyle, kamera önizlemesinin en boy oranına uyacak şekilde kırpılmış ve sonra önizlemeyi dolduracak şekilde ölçeklendirilir.
Kamera görüntüsünün en boy oranı olduğunda içe doğru dikey mod tetiklenir Sensör ile uygulamanın birincil etkinliğinin en boy oranı eşleşmiyor.
![Dizüstü bilgisayarda uygun dikey yönde kamera önizlemesi ve uygulama kullanıcı arayüzü.
Geniş önizleme resmi, dikey konuma sığacak şekilde ölçeklendirilir ve kırpılır
Yönü.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_inset_portrait_mode.png?authuser=8&hl=tr)
Şekil 8'de yalnızca dikey kamera uygulaması, kullanıcı arayüzünü gösterecek şekilde döndürüldü. dizüstü bilgisayar ekranında dik durması gerekir. Uygulama, fark nedeniyle sinemaskop efektiyle %30'luk bir artışa dikkat edin. Kamera önizleme resmi, uygulamanın kullanıcı arayüzü döndürmesini dengelemek üzere döndürüldü ( dikey modda olacak şekilde) kırpılmış ve ölçeklenerek dikey yönde olduğundan görüş alanını küçültür.
Döndürün, kırpın, ölçeklendirin
Bir ekranda yalnızca dikey kamera uygulaması için içe doğru dikey mod çağrılıyor şuna dikkat edin:
![Dizüstü bilgisayarda kamera önizlemesi dik, uygulamanın kullanıcı arayüzü yan duruyor.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_inset_portrait_mode_fixed-orientation_app.png?authuser=8&hl=tr)
Uygulama dikey yönde sinemaskopludur:
![Uygulama dikey yöne döndürüldü ve sinemaskoplu hale getirildi. Resim:
yukarıdan sağa doğru kaydırın.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_inset_portrait_mode_rotate_ui.png?authuser=8&hl=tr)
Kamera görüntüsü 90 derece dönerek yeniden yönünün ayarlanması uygulama:
![Sensör görüntüsü dik olacak şekilde 90 derece döndürüldü.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_inset_portrait_mode_rotate_sensor_image.png?authuser=8&hl=tr)
Resim, kamera önizlemesinin en boy oranına kadar kırpılır ve ardından önizlemeyi doldurun (görüş alanı küçültülür):
![Kırpılmış kamera resmi, kamera önizlemesini dolduracak şekilde ölçeklendirildi.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/laptop_inset_portrait_mode_crop_and_scale.png?authuser=8&hl=tr)
Katlanabilir cihazlarda kamera sensörünün yönü dikey olabilir Ekranın en boy oranı yatayken:
![Kamera önizlemesi ve uygulama kullanıcı arayüzü, geniş ve açılmış bir ekranın yan tarafına çevrildi.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/unfolded_phone_camera_preview_fixed-orientation_app.png?authuser=8&hl=tr)
Kamera önizlemesi, sensör yönünü ayarlamak için döndürüldüğünden, Resim vizörde doğru şekilde ayarlı, ancak yalnızca dikey modda yan yanadır.
Inset dikey mod, yalnızca uygulamanın sinemaskop moduna dikey yönde ayarlanmasını gerektirir uygulamanın ve kamera önizlemesinin yönünü doğru şekilde ayarlamak için:
![Kamera önizlemeli dikey yönde sinemaskoplu uygulama
katlanabilir cihaz üzerinde tam dik durması gerekir.](https://developer.android.google.cn/static/images/training/camera/camera2/camera-preview/unfolded_phone_inset_portrait_mode.png?authuser=8&hl=tr)
API
Android 12 (API düzeyi 31) sürümünden itibaren uygulamalar, dikey dikey ayarı açıkça kontrol edebilir.
modlarında
SCALER_ROTATE_AND_CROP
CaptureRequest
mülkü
sınıfını kullanır.
Varsayılan değer:
SCALER_ROTATE_AND_CROP_AUTO
Bu, sistemin içe doğru dikey modu çağırmasını sağlar.
SCALER_ROTATE_AND_CROP_90
yukarıda açıklandığı gibi, içe doğru dikey modun davranışıdır.
Bazı cihazlar bazı SCALER_ROTATE_AND_CROP
değerlerini desteklemez. Liste almak için
değerleri girin, referans
CameraCharacteristics#SCALER_AVAILABLE_ROTATE_AND_CROP_MODES
.
KameraX
Jetpack CameraX kitaplığı sensör yönünü ve çerçeveyi barındıran bir kamera vizörü oluşturmayı çok basit bir görevdir.
PreviewView
düzen öğesi
kamera önizlemesi oluşturur ve sensör yönünü otomatik olarak ayarlar.
cihaz döndürme ve ölçeklendirme. PreviewView
,
otomatik fotoğraf makinesi resmi
FILL_CENTER
ölçek türü, resmi ortalayan ancak boyutlarla eşleşecek şekilde kırpabilen ölçek türü
PreviewView
. Kamera resmini sinemaskop yapmak için ölçek türünü şuna ayarlayın:
FIT_CENTER
.
PreviewView
ile kamera önizlemesi oluşturmayla ilgili temel bilgileri öğrenmek için bkz.
Önizleme uygulama.
Eksiksiz bir örnek uygulama için
CameraXBasic
kod deposunu ziyaret edin.
KameraVizörü
Önizleme kullanım alanına benzer şekilde, KameraVizörü kitaplığı, kamera önizlemesinin oluşturulmasını kolaylaştıran bir dizi araç sunar. CameraX Core'a bağlı olmadığı için kameranızı kullanarak sorunsuz bir şekilde entegre edebilirsiniz. mevcut Kamera2 kod tabanı.
Bunun yerine
Surface
doğrudan isterseniz
CameraViewfinder
widget'ını kullanabilirsiniz.
CameraViewfinder
, dahili olarak bir TextureView
veya SurfaceView
kullanıyor
görüntüler ve gerekli dönüşümleri bunlara uygular.
vizörü doğru şekilde görüntülemenizi sağlar.
Bu işlem, öğelerin en boy oranını, ölçeğini ve döndürmesini düzeltmeyi içerir.
CameraViewfinder
nesnesinden yüzey isteğinde bulunmak için şunları yapmanız gerekir:
ViewfinderSurfaceRequest
oluşturun.
Bu istek, yüzey çözünürlüğü ve kamera cihazı ile ilgili koşullar içeriyor.
CameraCharacteristics
tarafından sağlanan bilgiler.
requestSurfaceAsync()
aranıyor
isteği yüzey sağlayıcıya (TextureView
veya ) gönderir.
SurfaceView
ve Surface
/ListenableFuture
alır.
markSurfaceSafeToRelease()
aranıyor
yüzey sağlayıcıya, yüzeyin gerekli olmadığını ve ilgili yüzeyin gerekli olmadığını bildirirse
kaynaklar serbest bırakılabilir.
Kotlin
fun startCamera(){ val previewResolution = Size(width, height) val viewfinderSurfaceRequest = ViewfinderSurfaceRequest(previewResolution, characteristics) val surfaceListenableFuture = cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest) Futures.addCallback(surfaceListenableFuture, object : FutureCallbackS<urface >{ override fun onSuccess(surface: Surface) { /* create a CaptureSession using this surface as usual */ } override fun onFailure(t: Throwable) { /* something went wrong */} }, ContextCompat.getMainExecutor(context)) }
Java
void startCamera(){ Size previewResolution = new Size(width, height); ViewfinderSurfaceRequest viewfinderSurfaceRequest = new ViewfinderSurfaceRequest(previewResolution, characteristics); ListenableFutureS<urface >surfaceListenableFuture = cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest); Futures.addCallback(surfaceListenableFuture, new FutureCallbackS<urface(>) { @Override public void onSuccess(Surface result) { /* create a CaptureSession using this surface as usual */ } @Override public void onFailure(Throwable t) { /* something went wrong */} }, ContextCompat.getMainExecutor(context)); }
SurfaceView
SurfaceView
bir
önizlemenin düzgün çalışmaması durumunda kamera önizlemesi
işlem gerektirmesi ve animasyonlu olmamalıdır.
SurfaceView
, kamera sensörü görüntü arabelleğini eşleşecek şekilde otomatik olarak döndürür
Ekran yönü (hem sensör yönünü hem de cihazı hesaba katarak)
sağlayabilir. Ancak resim arabelleği, SurfaceView
aralığına sığacak şekilde ölçeklendirilir
boyutları nasıl oluşturacağınızı düşünün.
Resim arabelleğinin en boy oranının, en boy oranıyla eşleştiğinden emin olmalısınız.
İçeriği ölçeklendirerek elde edebileceğiniz SurfaceView
oranı
bileşeninin SurfaceView
içindeki
onMeasure()
yöntem:
(computeRelativeRotation()
kaynak kodu
Aşağıdaki Göreli rotasyon.)
Kotlin
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val width = MeasureSpec.getSize(widthMeasureSpec) val height = MeasureSpec.getSize(heightMeasureSpec) val relativeRotation = computeRelativeRotation(characteristics, surfaceRotationDegrees) if (previewWidth > 0f && previewHeight > 0f) { /* Scale factor required to scale the preview to its original size on the x-axis. */ val scaleX = if (relativeRotation % 180 == 0) { width.toFloat() / previewWidth } else { width.toFloat() / previewHeight } /* Scale factor required to scale the preview to its original size on the y-axis. */ val scaleY = if (relativeRotation % 180 == 0) { height.toFloat() / previewHeight } else { height.toFloat() / previewWidth } /* Scale factor required to fit the preview to the SurfaceView size. */ val finalScale = min(scaleX, scaleY) setScaleX(1 / scaleX * finalScale) setScaleY(1 / scaleY * finalScale) } setMeasuredDimension(width, height) }
Java
@Override void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int relativeRotation = computeRelativeRotation(characteristics, surfaceRotationDegrees); if (previewWidth > 0f && previewHeight > 0f) { /* Scale factor required to scale the preview to its original size on the x-axis. */ float scaleX = (relativeRotation % 180 == 0) ? (float) width / previewWidth : (float) width / previewHeight; /* Scale factor required to scale the preview to its original size on the y-axis. */ float scaleY = (relativeRotation % 180 == 0) ? (float) height / previewHeight : (float) height / previewWidth; /* Scale factor required to fit the preview to the SurfaceView size. */ float finalScale = Math.min(scaleX, scaleY); setScaleX(1 / scaleX * finalScale); setScaleY(1 / scaleY * finalScale); } setMeasuredDimension(width, height); }
Kamera önizlemesi olarak SurfaceView
uygulama hakkında daha fazla bilgi için bkz.
Kamera yönleri.
Doku Görünümü
TextureView
şundan daha düşük performans gösteriyor:
SurfaceView
(ve daha fazla iş) ama TextureView
maksimum verim almanızı sağlar
kontrol edebilirsiniz.
TextureView
, sensör görüntüsü arabelleğini sensör yönüne göre döndürür ancak
cihaz döndürme veya önizleme ölçeklendirmesi işlemlerini yapmaz.
Ölçeklendirme ve döndürme,
Matris dönüşümü. Nasıl yapıldığını öğrenmek için
bir TextureView
öğesinin doğru şekilde ölçeklenmesini ve döndürülmesini sağlamak için
Kamera uygulamanızda yeniden boyutlandırılabilir yüzeyleri destekleme
Göreli döndürme
Kamera sensörünün bağıl dönüşü, bir hareketi yapmak için gereken dönüş kamera sensörü çıkışını cihazın yönüyle aynı hizaya getirin.
Göreli rotasyon SurfaceView
ve TextureView
gibi bileşenler tarafından kullanılır
kullanarak önizleme resmine ilişkin x ve y ölçeklendirme faktörlerini belirler. Ayrıca şu amaçlarla da kullanılır:
sensör görüntüsü arabelleğinin dönüşünü belirtin.
İlgili içeriği oluşturmak için kullanılan
CameraCharacteristics
ve
Surface
sınıf,
kamera sensörünün göreli dönüşü:
Kotlin
/** * Computes rotation required to transform the camera sensor output orientation to the * device's current orientation in degrees. * * @param characteristics The CameraCharacteristics to query for the sensor orientation. * @param surfaceRotationDegrees The current device orientation as a Surface constant. * @return Relative rotation of the camera sensor output. */ public fun computeRelativeRotation( characteristics: CameraCharacteristics, surfaceRotationDegrees: Int ): Int { val sensorOrientationDegrees = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)!! // Reverse device orientation for back-facing cameras. val sign = if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT ) 1 else -1 // Calculate desired orientation relative to camera orientation to make // the image upright relative to the device orientation. return (sensorOrientationDegrees - surfaceRotationDegrees * sign + 360) % 360 }
Java
/** * Computes rotation required to transform the camera sensor output orientation to the * device's current orientation in degrees. * * @param characteristics The CameraCharacteristics to query for the sensor orientation. * @param surfaceRotationDegrees The current device orientation as a Surface constant. * @return Relative rotation of the camera sensor output. */ public int computeRelativeRotation( CameraCharacteristics characteristics, int surfaceRotationDegrees ){ Integer sensorOrientationDegrees = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); // Reverse device orientation for back-facing cameras. int sign = characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT ? 1 : -1; // Calculate desired orientation relative to camera orientation to make // the image upright relative to the device orientation. return (sensorOrientationDegrees - surfaceRotationDegrees * sign + 360) % 360; }
Aralık metrikleri
Kameranın boyutlarını belirlemek için ekran boyutu kullanılmamalıdır vizör kamera uygulaması ekranın bir kısmında çalışıyor olabilir. çoklu pencere modunda veya ChromeOS'te serbest modda kullanılabilir.
WindowManager#getCurrentWindowMetrics()
(API düzeyi 30'da eklenir),
ekranın boyutu. Jetpack WindowManager kitaplığı yöntemleri
WindowMetricsCalculator#computeCurrentWindowMetrics()
ve
WindowInfoTracker#currentWindowMetrics()
API düzeyi 14'e geriye dönük uyumlulukla benzer bir destek sağlar.
180 derece döndürme
Bir cihazın 180 derece döndürülmesi (örneğin, doğal yönden
doğal yönü ters çevirse de)
onConfigurationChanged()
geri arama. Bu nedenle kamera önizlemesi ters dönebilir.
180 derecelik bir dönüşü algılamak için
DisplayListener
ve bir çağrı ile cihazın dönüşünü kontrol edin.
Display#getRotation()
onDisplayChanged()
geri arama.
Özel kaynaklar
Android 10'dan önce, çoklu pencerede yalnızca en üstte görünen etkinlik
ortam RESUMED
durumundaydı. Kullanıcılar açısından kafa karıştırıcıydı.
sistem, hangi etkinliğin devam ettirildiğine dair hiçbir gösterge sağlamadı.
Android 10 (API düzeyi 29), tüm görünür etkinliklerin olduğu çoklu devam ettirmeyi kullanıma sundu
RESUMED
durumunda. Görünür etkinlikler yine de PAUSED
içine girebilir
Bu durumda, örneğin, şeffaf bir etkinlik bu etkinliğin
bu etkinlik, pencere içinde pencere modundaki gibi odaklanılamıyorsa (bkz.
Pencere içinde pencere desteği).
kamera, mikrofon ya da başka herhangi bir özel veya
API düzeyi 29 veya üst kısmındaki tekli kaynağı, çoklu devam ettirmeyi desteklemelidir. Örneğin,
Örneğin, devam ettirilen üç etkinlik kamerayı kullanmak
istediğinde bunlardan yalnızca biri
bu özel kaynağa erişin. Her etkinlik bir
onDisconnected()
daha yüksek bir öncelik düzeyiyle kameraya önleme amaçlı erişim konusunda bilgi almak için geri çağırma
etkinliği'ne dokunun.
Daha fazla bilgi için bkz. Çoklu devam ettirme.
Ek kaynaklar
- Camera2 örneği için Kamera2Basic uygulamasına göz atın bulabilirsiniz.
- CameraX önizleme kullanım alanı hakkında bilgi edinmek için CameraX'e bakın Önizleme uygulayın.
- CameraX kamera önizleme örnek uygulaması için bkz. KameraXBasic kod deposunu ziyaret edin.
- ChromeOS'te kamera önizlemesi hakkında bilgi edinmek için bkz. Kamera yönleri.
- Katlanabilir cihazlar için uygulama geliştirme hakkında bilgi almak üzere bkz. bkz. Katlanabilir cihazlar hakkında bilgi edinin.