Önizleme uygulama

Uygulamanıza önizleme eklerken PreviewView, bir Doğru şekilde görüntülenmesi için kırpılabilen, ölçeklendirilebilen ve döndürülebilen View.

Resim önizlemesi, PreviewView öğesinin içindeki bir yüzeye kamera etkinleşir.

PreviewView'u kullanma

PreviewView kullanarak CameraX için önizleme uygulamak aşağıdakileri içerir: ele alacağız:

  1. İsteğe bağlı olarak, CameraXConfig.Provider.
  2. Düzeninize PreviewView ekleyin.
  3. İstekte bulunun ProcessCameraProvider.
  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 kullanımında bazı sınırlamalar söz konusudur. PreviewView uygulamasını kullanırken şu işlemleri yapamazsınız: aşağıdakilerden birini yapabilirsiniz:

  • TextureView tarihinde ayarlamak için bir SurfaceTexture oluşturun ve Preview.SurfaceProvider.
  • TextureView kaynağından SurfaceTexture öğesini al ve ayarla Preview.SurfaceProvider.
  • SurfaceView adlı satıcıdan Surface al ve etkinleştir Preview.SurfaceProvider.

Bunlardan herhangi biri gerçekleşirse Preview, PreviewView.

Düzeninize PreviewView ekleme

Aşağıdaki örnekte, bir düzen içinde PreviewView öğesi gösterilmektedir:

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

CameraProvider iste

Aşağıdaki kodda nasıl CameraProvider isteğinde bulunulacağı gösterilmektedir:

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ılabilirliğini kontrol et

CameraProvider isteğinde bulunduktan sonra başlatmanın başarılı olduğunu doğrulayın . Aşağıdaki kodda bunun nasıl yapılacağı 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şlevinin bir örneği için koda bakın. ele alacağız.

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

CameraProvider öğesini 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 ağına bağlayın.

Aşağıdaki kodda bir örnek gösterilmektedir:

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() etiketinin Camera değeri döndürdüğünü unutmayın. nesnesini tanımlayın. Kamera çıkışını (ör. yakınlaştırma ve uzaklaştırma) kontrol etme bkz. Kamera çıkışı.

Kamera önizlemesini uygulamayı tamamladınız. Uygulamanızı derleyip onaylayın istediğiniz gibi çalıştığından emin olun.

PreviewView için ek kontroller

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

Uygulama modu

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

  • PERFORMANCE varsayılan moddur. PreviewView, bir Videoyu göstermek için SurfaceView akışa geri dönüyor ancak TextureView durumuna geri dönüyor belirli durumlarda. SurfaceView, özel bir çizim yüzeyine sahip. Bu yüzeylerin özellikle başka kullanıcı arayüzü öğeleri olmadığında, dahili donanım birleştirici tarafından bir donanım yer paylaşımıyla uygulanması (düğmeler gibi) seçin. Donanımla oluşturma yer paylaşımı. Video kareleri GPU yolundan kaçınarak platform gücünü azaltabilir tüketim ve gecikmeyi gösterir.

  • COMPATIBLE yatırım yapmanız önemlidir. Bu modda, PreviewView, orijinalinden farklı olarak bir TextureView kullanır. SurfaceView için özel bir çizim yüzeyi yok. Sonuç olarak, karıştırılarak görüntülenmesini sağlar. Bu ek adımda, Uygulama, ölçeklendirme ve döndürme gibi ek işlemler gerçekleştirebilir videoları kısıtlamaz.

PreviewView.setImplementationMode() kullanın uygulamanıza uygun uygulama modunu seçin. Varsayılan PERFORMANCE modu uygulamanız için uygun değil. Şu kod var: örnek, COMPATIBLE modunun nasıl ayarlanacağını gösterir:

Kotlin

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

Ölçek türü

Önizleme videosu çözünürlüğü, hedefinizin boyutlarından farklı olduğunda PreviewView, video içeriğinin kırpılarak veya kırpılarak görünüme uyması gerekir. sinemaskop (orijinal en boy oranını koruması). PreviewView, ScaleTypes kişiyi takip ediyor şu amaç için:

  • FIT_CENTER FIT_START, ve FIT_END sinemaskop. Tam video içeriği otomatik olarak PreviewView hedefinde görüntülenebilecek maksimum olası boyut. Ancak video karesinin tamamı görünüyor olsa da ekranın bir kısmı gösteriliyor. boş olabilir. Bu üç ölçek türünden hangisini seçtiğinize bağlı olarak, video karesi, hedef görünümün ortasına, başlangıcına veya sonuna hizalanır.

  • FILL_CENTER FILL_START, Şunun için FILL_END: yardımcı olabilir. Video, PreviewView en boy oranıyla eşleşmezse yalnızca bir kısmı görünüyor ancak video PreviewView tamamını dolduruyor.

CameraX'in kullandığı varsayılan ölçek türü FILL_CENTER'dür. PreviewView.setScaleType() kullanın kullanın. Aşağıdaki kod örnek, 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 süreci aşağıdaki adımlardan oluşur:

  1. Videoyu ölçeklendirin:
    • 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 PreviewView hedefine hizalayın:
    • FIT_CENTER/FILL_CENTER için, ölçeklendirilmiş videoyu ve PreviewView hedefini ortaya hizalayın.
    • FIT_START/FILL_START için ölçeklendirilmiş video ile hedefi hizalayın her birinin sol üst köşesine göre PreviewView.
    • FIT_END/FILL_END için ölçeklendirilmiş video ile hedefi hizalayın her birinin sağ alt köşesine göre PreviewView.

Örneğin, burada 640x480 boyutunda bir kaynak video ve 1920x1080 boyutunda bir hedef gösterilmektedir PreviewView:

640x480 boyutundaki video ile 1920x1080 boyutundaki önizlemenin gösterildiği resim

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

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

İşlem aşağıdaki gibi işler:

  1. 1440x1080 boyutunda bir ara video karesi elde etmek için video karesini (orijinal en boy oranını koruyarak) min(1920/640, 1080/480) = 2.25 ile ölçeklendirin.
  2. 1440x1080 boyutundaki video karesini 1920x1080 boyutundaki PreviewView ile hizalayın.
    • FIT_CENTER için video karesini videonun ortasına hizalayın PreviewView penceresi. Bu sütunun 240 piksellik başlangıç ve bitiş sütunları PreviewView boş.
    • FIT_START için video karesini başlangıçla (sol üst köşe) hizalayın (PreviewView penceresi) PreviewView öğesinin sondaki 480 piksellik sütunları boştur.
    • FIT_END için video karesini end (sağ alt köşe) ile hizalayın (PreviewView penceresi) Sütunun başlangıç 480 piksellik sütunları PreviewView boş.

Aşağıdaki resimde FILL_START / FILL_CENTER / FILL_END gösterilmektedir ölçeklendirme süreci:

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

İşlem aşağıdaki gibi işler:

  1. Şuna sahip olmak için video karesini max(1920/640, 1080/480) = 3 ile ölçeklendirin: 1920x1440 (videonun PreviewView) tıklayın.
  2. 1920x1440 boyutundaki video çerçevesini 1920x1080 boyutundaki PreviewView penceresine sığacak şekilde kırpın.
    • FILL_CENTER için, 1920x1440'ın ortasından 1920x1080 boyutlu kırpın ölçeklendirilmiş videodur. Videonun üst ve alt 180 satırı gösterilmiyor.
    • FILL_START için, 1920x1440 ölçeklendirilmiş öğenin başından 1920x1080 oranında kırp videosunu izleyin. Videonun alt 360 derecelik satırları görünmüyor.
    • FILL_END için, 1920x1440 ölçeğinin sonundan 1920x1080 boyutunda kırpın videosunu izleyin. Videonun ilk 360 derecelik kısmı görünmüyor.

Ek kaynaklar

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

Kod Laboratuvarı

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

  • CameraX örnek uygulamaları