Önizleme uygulama

Uygulamanıza önizleme eklerken PreviewView kullanın. Bu öğe, düzgün görüntülenme için kırpılabilen, ölçeklendirilebilen ve döndürülebilen bir View öğesidir.

Resim önizlemesi, kamera etkin hale geldiğinde PreviewView içindeki bir yüzeye yayın yapar.

PreviewView'ı kullanma

PreviewView kullanarak CameraX için önizlemenin uygulanması, sonraki bölümlerde ele alınacak 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 isteyin.
  4. View oluşturulduğunda ProcessCameraProvider olup olmadığını kontrol edin.
  5. Bir kamera seçip yaşam döngüsü ile kullanım alanlarını birbirine bağlayın.

PreviewView kullanımıyla ilgili bazı sınırlamalar vardır. PreviewView kullanırken aşağıdakilerin hiçbirini yapamazsınız:

  • TextureView ve Preview.SurfaceProvider için ayarlamak üzere bir SurfaceTexture oluşturun.
  • SurfaceTexture veri kümesini TextureView kaynağından alın ve Preview.SurfaceProvider üzerinde ayarlayın.
  • SurfaceView adlı satıcıdan Surface alın ve Preview.SurfaceProvider üzerinde ayarlayın.

Bunlardan herhangi biri olursa Preview, kareleri PreviewView'a aktarmayı durdurur.

Düzeninize PreviewView ekleme

Aşağıdaki örnekte, bir düzende PreviewView gösterilmektedir:

<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>

CameraProvider isteğinde bulunma

Aşağıdaki kod, nasıl CameraProvider isteğinde bulunacağınızı gösterir:

Kotlin

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

Java

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

public class MainActivity extends AppCompatActivity {
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    }
}

CameraProvider'ın kullanılabilir olup olmadığını kontrol et

CameraProvider istedikten sonra, görünüm oluşturulduğunda başlatma işleminin başarılı olduğunu doğrulayın. Bunun nasıl yapılacağı aşağıdaki kodda gösterilmektedir:

Kotlin

cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))

Java

cameraProviderFuture.addListener(() -> {
    try {
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
        bindPreview(cameraProvider);
    } catch (ExecutionException | InterruptedException e) {
        // No errors need to be handled for this Future.
        // This should never be reached.
    }
}, ContextCompat.getMainExecutor(this));

Bu örnekte kullanılan bindPreview işlevine örnek için bir sonraki bölümde verilen koda bakın.

Bir kamera seçip yaşam döngüsü ile kullanım alanlarını bağlayın

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 varsa kullanım alanlarını yaşam döngüsüne bağlayın.
  4. Preview cihazını PreviewView uygulamasına bağlayın.

Aşağıdaki kod bir örnek gösterir:

Kotlin

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)
}

Java

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    preview.setSurfaceProvider(previewView.getSurfaceProvider());

    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, 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ışı başlıklı makaleyi inceleyin.

Kamera önizlemesini uygulamayı tamamladınız. Uygulamanızı oluşturun ve önizlemenizin uygulamanızda göründüğünü ve istediğiniz gibi çalıştığını onaylayın.

PreviewView için ek denetimler

CameraX PreviewView, aşağıdaki gibi özellikleri yapılandırmak için bazı ek API'ler sağlar:

Uygulama modu

PreviewView, View hedefine bir önizleme akışı oluşturmak için aşağıdaki modlardan birini kullanabilir:

  • PERFORMANCE varsayılan moddur. PreviewView, video akışını görüntülemek için bir SurfaceView kullanır ancak bazı durumlarda TextureView değerine döner. SurfaceView, özellikle önizleme videosunun üzerinde başka kullanıcı arayüzü öğeleri (düğmeler gibi) yoksa dahili donanım birleştirici tarafından bir donanım yer paylaşımı ile uygulanma ihtimali daha yüksek olan özel bir çizim yüzeyine sahiptir. Video kareleri, donanım yer paylaşımıyla görüntülenerek GPU yolundan kaçınır. Bu da platform güç tüketimini ve gecikmeyi azaltabilir.

  • COMPATIBLE moduna gidin. Bu modda PreviewView, SurfaceView'in aksine özel bir çizim yüzeyi olmayan TextureView kullanır. Sonuç olarak video, gösterilebilmesi için harmanlanarak oluşturulur. Bu ek adımda 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() aracını 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:

Kotlin

// viewFinder is a PreviewView instance
viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE

Ölçek türü

Önizleme video çözünürlüğü, hedef PreviewView öğenizin boyutlarından farklı olduğunda video içeriğinin kırpılarak veya yatay kenarlık kullanılarak (orijinal en boy oranı korunarak) görünüme sığması gerekir. PreviewView, bu amaçla aşağıdaki ScaleTypes içeriğini sağlar:

  • FIT_CENTER, FIT_START ve sinemaskop için FIT_END. Tam video içeriği, hedef PreviewView içinde görüntülenebilecek mümkün olan maksimum boyuta göre ölçeklendirilir (yukarı veya aşağı). Bununla birlikte, video karesinin tamamı görünür olsa da ekranın bir kısmı boş olabilir. Bu üç ölçek türünden hangisini seçtiğinize bağlı olarak video çerçevesi, hedef Görünümün ortasına, başlangıcı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 öğesinin tamamını doldurur.

CameraX'in kullandığı varsayılan ölçek türü FILL_CENTER'dir. Uygulamanıza en uygun ölçek türünü ayarlamak için PreviewView.setScaleType() kullanın. Aşağıdaki kod örneği, FIT_CENTER ölçek türünü ayarlar:

Kotlin

// viewFinder is a PreviewView instance
viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER

Video görüntüleme işlemi aşağıdaki adımlardan oluşur:

  1. Videoyu ölçeklendirin:
    • FIT_* ölçek türü için videoyu min(dst.width/src.width, dst.height/src.height) ile ölçeklendirin.
    • FILL_* ölçek türü için videoyu max(dst.width/src.width, dst.height/src.height) ile ölçeklendirin.
  2. Ölçeklendirilmiş videoyu PreviewView hedefine hizalayın:
    • FIT_CENTER/FILL_CENTER için, ölçeklendirilmiş videoyu ortaya ve PreviewView hedefine hizalayın.
    • FIT_START/FILL_START için, ölçeklendirilmiş videoyu ve PreviewView hedefini 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 boyutunda bir kaynak video ve 1920x1080 boyutunda bir hedefi burada görebilirsiniz PreviewView:

640x480 boyutundaki bir videoyu 1920x1080 boyutundaki önizlemeyle karşılaştıran resim

Aşağıdaki resimde FIT_START / FIT_CENTER / FIT_END ölçeklendirme işlemi gösterilmektedir:

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

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

  1. 1440x1080 ara video karesi elde etmek için video karesini min(1920/640, 1080/480) = 2.25 ile ölçeklendirin (orijinal en boy oranını koruyun).
  2. 1440x1080 boyutundaki 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ş 240 piksel sütunları boş.
    • FIT_START için, video karesini PreviewView penceresinin başlangıcı (sol üst köşe) ile hizalayın. PreviewView öğesinin sondaki 480 piksellik sütunları boş.
    • FIT_END için, video karesini PreviewView penceresinin sonu (sağ alt köşe) ile hizalayın. PreviewView öğesinin başlangıç 480 piksel sütunları boş.

Aşağıdaki resimde FILL_START / FILL_CENTER / FILL_END ölçeklendirme işlemi gösterilmektedir:

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

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

  1. 1920x1440 boyutunda (PreviewView boyutundan daha büyük) ara video karesi elde etmek için video karesini max(1920/640, 1080/480) = 3 ile ölçeklendirin.
  2. 1920x1440 boyutundaki video karesini, 1920x1080 PreviewView penceresine sığacak şekilde kırpın.
    • FILL_CENTER için, 1920x1440 ölçeklendirilmiş videonun ortasından 1920x1080 oranında kırpın. Videonun üst ve alt 180 satırı gösterilmiyor.
    • FILL_START için, 1920x1440 ölçeklendirilmiş videonun başlangıçından 1920x1080 oranında kırpın. Videonun alt 360 derecelik satırları gösterilmiyor.
    • FILL_END için, 1920x1440 ölçeklendirilmiş videonun sonundan 1920x1080 oranında kırpın. Videonun ilk 360 derecelik satırları gösterilmiyor.

Ek kaynaklar

CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Codelab

  • CameraX'i kullanmaya başlama
  • Kod örneği

  • CameraX örnek uygulamaları