Önizleme uygulama

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:

  1. İsteğe bağlı olarak bir CameraXConfig.Provider yapılandırın.
  2. Düzeninize PreviewView ekleyin.
  3. ProcessCameraProvider isteğinde bulunun.
  4. View oluşturulurken ProcessCameraProvider olup olmadığını kontrol edin.
  5. 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:

  • TextureView ve Preview.SurfaceProvider için SurfaceTexture oluşturun.
  • SurfaceTexture değerini TextureView üzerinden alın ve Preview.SurfaceProvider üzerinde ayarlayın.
  • Surface değerini SurfaceView üzerinden alın ve Preview.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:

  1. Preview oluşturun.
  2. İstediğiniz kamera LensFacing seçeneğini belirtin.
  3. Seçilen kamerayı ve kullanım alanlarını yaşam döngüsüne bağlayın.
  4. Preview cihazını PreviewView cihazı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:

Uygulama modu

PreviewView, önizleme akışını hedef View üzerinde oluşturmak için aşağıdaki modlardan birini kullanabilir:

  • PERFORMANCE varsayılan moddur. PreviewView, video akışını görüntülemek için SurfaceView kullanır ancak belirli durumlarda TextureView kullanmaya 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.

  • COMPATIBLE modu. Bu modda PreviewView, SurfaceView'nin aksine özel bir çizim yüzeyi olmayan bir TextureView kullanı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_START ve FIT_END. Video içeriğinin tamamı, hedef PreviewView iç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. Video PreviewView en-boy oranıyla eşleşmiyorsa içeriğin yalnızca bir kısmı görünür ancak video PreviewView alanı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:

  1. Videoyu ölçeklendirme:
    • FIT_* ölçek türleri için videoyu min(dst.width/src.width, dst.height/src.height) ile ölçeklendirin.
    • FILL_* ölçek türleri için videoyu max(dst.width/src.width, dst.height/src.height) ile ölçeklendirin.
  2. Ölçeklendirilmiş videoyu hedef PreviewView ile hizalayın:
    • FIT_CENTER/FILL_CENTER için ölçeklendirilmiş videoyu ve hedef PreviewView öğesini ortaya hizalayın.
    • FIT_START/FILL_START için, ölçeklendirilmiş videoyu ve hedefi PreviewView her birinin sol üst köşesine göre hizalayın.
    • FIT_END/FILL_END için, ölçeklendirilmiş videoyu ve hedefi PreviewView her birinin sağ alt köşesine göre hizalayın.

Örneğin, 640x480 kaynak video ve 1920x1080 hedef video: PreviewView

640x480 boyutundaki bir videonun 1920x1080 boyutundaki önizlemeyle karşılaştırmasını gösteren resim

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

FIT_START, FIT_CENTER ve FIT_END ölçeklendirme sürecini gösteren resim

Süreç şu şekilde işler:

  1. 1440x1080 boyutunda bir ara video karesi elde etmek için video karesini min(1920/640, 1080/480) = 2.25 ile ölçeklendirin (orijinal en boy oranını koruyarak).
  2. 1440x1080 video karesini 1920x1080 PreviewView ile hizalayın.
    • FIT_CENTER için video karesini PreviewView penceresinin ortasına hizalayın. PreviewView öğesinin başlangıç ve bitişteki 240 piksellik sütunları boş.
    • FIT_START için video karesini PreviewView penceresinin başlangıcı (sol üst köşe) ile hizalayın. PreviewView öğesinin son 480 piksellik sütunları boş.
    • FIT_END için video karesini PreviewView penceresinin 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:

FILL_START, FILL_CENTER ve FILL_END ölçeklendirme işlemini gösteren resim

Süreç şu şekilde işler:

  1. max(1920/640, 1080/480) = 3 ile video karesini ölçeklendirerek 1920x1440 boyutunda bir ara video karesi (PreviewView boyutundan daha büyük) elde edin.
  2. 1920x1440 video karesini 1920x1080 PreviewView penceresine sığacak şekilde kırpın.
    • FILL_CENTER iç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_START için 1920x1440 ölçekli videonun başından 1920x1080 kırpın. Videonun alt 360 satırı görünmez.
    • FILL_END iç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

  • CameraX'i Kullanmaya Başlama
  • Kod örneği

  • CameraX örnek uygulamaları