Uygulamanıza önizleme eklerken düzgün görüntüleme için kırpılabilen, ölçeklendirilebilen ve döndürülebilen bir View olan PreviewView kullanın.
Kamera etkinleştirildiğinde görüntü önizlemesi PreviewView içindeki bir yüzeye aktarılır.
PreviewView'u kullanma
PreviewView kullanarak CameraX için önizleme uygulamak, sonraki bölümlerde ele alınan aşağıdaki adımları içerir:
- İsteğe bağlı olarak bir
CameraXConfig.Provideryapılandırın. - Düzeninize
PreviewViewekleyin. ProcessCameraProvideristeğinde bulunun.ViewoluşturulurkenProcessCameraProviderolup olmadığını kontrol edin.- Bir kamera seçip yaşam döngüsünü ve kullanım alanlarını bağlayın.
PreviewView kullanmanın bazı sınırlamaları vardır. PreviewView kullanırken aşağıdakilerden hiçbirini yapamazsınız:
TextureViewvePreview.SurfaceProvideriçinSurfaceTextureoluşturun.SurfaceTexturedeğeriniTextureViewüzerinden alın vePreview.SurfaceProviderüzerinde ayarlayın.SurfacedeğeriniSurfaceViewüzerinden alın vePreview.SurfaceProviderüzerinde ayarlayın.
Bunlardan herhangi biri gerçekleşirse Preview, PreviewView cihazına kare akışı yapmayı durdurur.
Düzeninize PreviewView ekleme
Aşağıdaki örnekte, bir düzendeki PreviewView gösterilmektedir:
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
CameraProvider isteğinde bulunma
Aşağıdaki kodda CameraProvider isteğinin nasıl gönderileceği gösterilmektedir:
// import androidx.camera.lifecycle.ProcessCameraProvider // import com.google.common.util.concurrent.ListenableFuture class MainActivity : ComponentActivity() { private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) } }
CameraProvider'ın kullanılabilirliğini kontrol etme
CameraProvider isteğinde bulunduktan sonra, görünüm oluşturulduğunda başlatma işleminin başarılı olduğunu doğrulayın. Aşağıdaki kodda bunun nasıl yapılacağı gösterilmektedir:
cameraProviderFuture.addListener( Runnable { val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this) )
Bu örnekte kullanılan bindPreview işlevinin bir örneği için sonraki bölümde verilen koda bakın.
Kamera seçip yaşam döngüsünü ve kullanım alanlarını bağlama
CameraProvider oluşturup onayladıktan sonra aşağıdakileri yapın:
Previewoluşturun.- İstediğiniz kamera
LensFacingseçeneğini belirtin. - Seçilen kamerayı ve kullanım alanlarını yaşam döngüsüne bağlayın.
PreviewcihazınıPreviewViewcihazına bağlayın.
Aşağıdaki kodda bir örnek gösterilmektedir:
fun bindPreview(cameraProvider: ProcessCameraProvider) { var preview: Preview = Preview.Builder() .build() var cameraSelector: CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() preview.setSurfaceProvider(previewView.getSurfaceProvider()) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) }
bindToLifecycle() işlevinin bir Camera nesnesi döndürdüğünü unutmayın. Yakınlaştırma ve pozlama gibi kamera çıkışını kontrol etme hakkında daha fazla bilgi için Kamera çıkışı bölümüne bakın.
Kamera önizlemesini uygulama işlemini tamamladınız. Uygulamanızı derleyin ve önizlemenizin uygulamanızda göründüğünü ve istediğiniz gibi çalıştığını doğrulayın.
PreviewView için ek kontroller
CameraX PreviewView, aşağıdaki gibi özellikleri yapılandırmak için bazı ek API'ler sağlar:
- Önizleme akışlarını oluşturmak için uygulama modu.
- Önizleme resmi ölçek türü.
Uygulama modu
PreviewView, önizleme akışını hedef View üzerinde oluşturmak için aşağıdaki modlardan birini kullanabilir:
PERFORMANCEvarsayılan moddur.PreviewView, video akışını görüntülemek içinSurfaceViewkullanır ancak belirli durumlardaTextureViewkullanmaya geri döner.SurfaceView, özel bir çizim yüzeyine sahiptir. Bu yüzeyin, özellikle önizleme videosunun üzerinde başka kullanıcı arayüzü öğeleri (düğmeler gibi) olmadığında dahili donanım birleştirici tarafından bir donanım yer paylaşımıyla uygulanma olasılığı daha yüksektir. Donanım yer paylaşımıyla oluşturulan video kareleri, GPU yolunu kullanmaz. Bu sayede platformun güç tüketimi ve gecikme süresi azalabilir.COMPATIBLEmodu. Bu moddaPreviewView,SurfaceView'nin aksine özel bir çizim yüzeyi olmayan birTextureViewkullanır. Bu nedenle, video görüntülenebilmesi için harmanlanarak oluşturulur. Bu ek adım sırasında uygulama, videoları kısıtlama olmadan ölçeklendirme ve döndürme gibi ek işlemler gerçekleştirebilir.
Uygulamanıza uygun uygulama modunu seçmek için PreviewView.setImplementationMode() kullanın. Varsayılan PERFORMANCE modu uygulamanız için uygun değilse aşağıdaki kod örneğinde COMPATIBLE modunun nasıl ayarlanacağı gösterilmektedir:
// viewFinder is a PreviewView instance. viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
Ölçek türü
Önizleme videosunun çözünürlüğü hedefinizin boyutlarından farklı olduğunda
PreviewView video içeriğinin kırpılarak veya sinemaskop (orijinal en boy oranını koruyarak) görünümüne sığdırılması gerekir. PreviewView, bu amaçla aşağıdaki ScaleTypes sunar:
Sinemaskop için
FIT_CENTER,FIT_STARTveFIT_END. Video içeriğinin tamamı, hedefPreviewViewiçinde gösterilebilecek maksimum boyuta ölçeklendirilir (büyütülür veya küçültülür). Ancak video karesinin tamamı görünür olsa da ekranın bir kısmı boş olabilir. Seçtiğiniz ölçek türüne bağlı olarak video karesi, hedef görünümün ortasına, başına veya sonuna hizalanır.Kırpma için
FILL_CENTER,FILL_START,FILL_END. VideoPreviewViewen-boy oranıyla eşleşmiyorsa içeriğin yalnızca bir kısmı görünür ancak videoPreviewViewalanının tamamını doldurur.
CameraX'in kullandığı varsayılan ölçek türü FILL_CENTER. Uygulamanız için en uygun ölçek türünü ayarlamak üzere PreviewView.setScaleType() kullanın. Aşağıdaki kod örneği, FIT_CENTER ölçek türünü ayarlar:
// viewFinder is a PreviewView instance. viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER
Video gösterme süreci aşağıdaki adımlardan oluşur:
- Videoyu ölçeklendirme:
FIT_*ölçek türleri için videoyumin(dst.width/src.width, dst.height/src.height)ile ölçeklendirin.FILL_*ölçek türleri için videoyumax(dst.width/src.width, dst.height/src.height)ile ölçeklendirin.
- Ölçeklendirilmiş videoyu hedef
PreviewViewile hizalayın:FIT_CENTER/FILL_CENTERiçin ölçeklendirilmiş videoyu ve hedefPreviewViewöğesini ortaya hizalayın.FIT_START/FILL_STARTiçin, ölçeklendirilmiş videoyu ve hedefiPreviewViewher birinin sol üst köşesine göre hizalayın.FIT_END/FILL_ENDiçin, ölçeklendirilmiş videoyu ve hedefiPreviewViewher birinin sağ alt köşesine göre hizalayın.
Örneğin, 640x480 kaynak video ve 1920x1080 hedef video:
PreviewView

Aşağıdaki resimde FIT_START / FIT_CENTER / FIT_END ölçeklendirme süreci gösterilmektedir:

Süreç şu şekilde işler:
- 1440x1080 boyutunda bir ara video karesi elde etmek için video karesini
min(1920/640, 1080/480) = 2.25ile ölçeklendirin (orijinal en boy oranını koruyarak). - 1440x1080 video karesini 1920x1080
PreviewViewile hizalayın.FIT_CENTERiçin video karesiniPreviewViewpenceresinin ortasına hizalayın.PreviewViewöğesinin başlangıç ve bitişteki 240 piksellik sütunları boş.FIT_STARTiçin video karesiniPreviewViewpenceresinin başlangıcı (sol üst köşe) ile hizalayın.PreviewViewöğesinin son 480 piksellik sütunları boş.FIT_ENDiçin video karesiniPreviewViewpenceresinin sonu (sağ alt köşe) ile hizalayın.PreviewViewöğesinin ilk 480 piksellik sütunları boş.
Aşağıdaki resimde FILL_START / FILL_CENTER / FILL_END ölçeklendirme süreci gösterilmektedir:

Süreç şu şekilde işler:
max(1920/640, 1080/480) = 3ile video karesini ölçeklendirerek 1920x1440 boyutunda bir ara video karesi (PreviewViewboyutundan daha büyük) elde edin.- 1920x1440 video karesini 1920x1080
PreviewViewpenceresine sığacak şekilde kırpın.FILL_CENTERiçin 1920x1440 ölçekli videonun merkezinden 1920x1080 kırpın. Videonun üst ve alt kısımlarındaki 180 satır görünmez.FILL_STARTiçin 1920x1440 ölçekli videonun başından 1920x1080 kırpın. Videonun alt 360 satırı görünmez.FILL_ENDiçin, 1920x1440 ölçekli videonun sonundan 1920x1080 kırpın. Videonun üstteki 360 satırı görünmez.
Ek kaynaklar
CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın.
Codelab
Kod örneği