Wdrażanie wersji przedpremierowej

Przy dodawaniu podglądu do aplikacji używaj funkcji PreviewView, czyli View, które można przyciąć, skalować i obrócić, aby zapewnić prawidłowe wyświetlanie.

Podgląd obrazu przesyła się na powierzchnię wewnątrz PreviewView, gdy kamera stanie się aktywna.

Użyj widoku podglądu

Implementacja podglądu w AparacieX za pomocą PreviewView obejmuje te czynności czynności, które zostały omówione w późniejszych sekcjach:

  1. Opcjonalnie skonfiguruj CameraXConfig.Provider
  2. Dodaj element PreviewView do układu.
  3. Poproś o ProcessCameraProvider
  4. Podczas tworzenia elementu View sprawdź ProcessCameraProvider.
  5. Wybierz kamerę i powiąż cykl życia oraz przypadki użycia.

Korzystanie z usługi PreviewView podlega pewnym ograniczeniom. Gdy korzystasz z usługi PreviewView, nie możesz: wykonaj dowolną z tych czynności:

  • Utwórz obiekt SurfaceTexture, aby ustawić go w: TextureView i Preview.SurfaceProvider.
  • Odzyskaj SurfaceTexture od dostawcy TextureView i skonfiguruj go Preview.SurfaceProvider
  • Kup urządzenie Surface od sprzedawcy SurfaceView i włącz je Preview.SurfaceProvider

Jeśli wystąpi któraś z tych sytuacji, Preview zatrzymuje strumieniowe przesyłanie klatek do PreviewView

Dodawanie elementu PreviewView do układu

Ten przykład pokazuje element PreviewView w układzie:

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

Poproś o usługę CameraProvider

Ten kod pokazuje, jak wysłać prośbę o CameraProvider:

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

Sprawdzanie dostępności komponentu CameraProvider

Po wysłaniu żądania funkcji CameraProvider sprawdź, czy została ona zainicjowana podczas tworzenia widoku. Jak to zrobić:

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

Aby zobaczyć przykład funkcji bindPreview użytej w tym przykładzie, zapoznaj się z kodem omówione w następnej sekcji.

Wybierz kamerę i powiąż cykl życia oraz przypadki użycia

Gdy utworzysz i potwierdzisz CameraProvider, wykonaj te czynności:

  1. Utwórz Preview.
  2. Określ żądaną opcję LensFacing kamery.
  3. Powiąż wybraną kamerę i wszystkie przypadki użycia z cyklem życia.
  4. Połącz Preview z urządzeniem PreviewView.

Oto przykład:

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

Pamiętaj, że bindToLifecycle() zwraca Camera obiektu. Więcej informacji o sterowaniu wyjściem kamery, na przykład dotyczące powiększenia, ekspozycja, patrz Dane wyjściowe aparatu.

Implementacja podglądu z aparatu została zakończona. Skompiluj aplikację i potwierdź aby podgląd wyświetlał się w aplikacji i działał zgodnie z oczekiwaniami.

Dodatkowe ustawienia widoku podglądu

CameraX PreviewView udostępnia dodatkowe interfejsy API do konfigurowania właściwości, takich jak: jako:

Tryb implementacji

PreviewView może używać jednego z poniższych trybów do renderowania strumienia podglądu docelowy View:

  • PERFORMANCE to tryb domyślny. Komponent PreviewView używa SurfaceView, aby wyświetlić film. w strumieniu, ale wraca do typu TextureView w określonych przypadkach. SurfaceView ma specjalną powierzchnię do rysowania, która zwiększa szanse na implementowanie z nakładką sprzętową przez wewnętrzny kompozytor sprzętowy, zwłaszcza gdy nie ma żadnych innych elementów interfejsu. (np. przyciski) nad podglądem filmu. Renderowanie za pomocą sprzętu nakładka, ramki wideo nie korzystają ze ścieżki GPU, co może zmniejszyć moc platformy i opóźnienia.

  • COMPATIBLE i trybu uzyskiwania zgody. W tym trybie funkcja PreviewView używa parametru TextureView, który w przeciwieństwie do SurfaceView nie ma osobnej powierzchni do rysowania. W rezultacie film renderuje się z mieszaniem, aby można go było wyświetlić. W trakcie tego dodatkowego kroku aplikacja może wykonywać dodatkowe przetwarzanie, np. skalowanie i rotację bez ograniczeń.

Użyj formatu PreviewView.setImplementationMode() aby wybrać tryb implementacji odpowiedni do Twojej aplikacji. Jeśli domyślnie Tryb PERFORMANCE nie jest odpowiedni dla Twojej aplikacji, ten kod przykład pokazuje, jak ustawić tryb COMPATIBLE:

Kotlin

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

Typ skali

Gdy rozdzielczość filmu w podglądzie różni się od wymiarów docelowego PreviewView, treści wideo muszą zostać dopasowane do widoku przez przycięcie lub letterbox (z zachowaniem pierwotnego formatu obrazu). PreviewView udostępnia obserwuje: ScaleTypes w tym celu:

  • FIT_CENTER, FIT_START, i FIT_END w formacie letterbox. Cała treść wideo jest skalowana (w górę lub w dół) do maksymalny możliwy rozmiar, który może się wyświetlać w docelowym PreviewView. Mimo że widoczna będzie pełna klatka wideo, pewna część ekranu może być puste. W zależności od tego, który z tych trzech typów skali wybierzesz, klatka wideo zostanie wyrównana do środka, początku lub końca docelowego widoku.

  • FILL_CENTER, FILL_START, FILL_END dla przycinanie. Jeśli film nie pasuje do formatu PreviewView, zostanie dodany tylko części treści są widoczne, ale film wypełnia cały PreviewView.

Domyślny typ skali używany przez AparatX to FILL_CENTER. Użyj formatu PreviewView.setScaleType() aby ustawić typ skali najlepiej odpowiadający Twojej aplikacji. Następujący kod: przykład ustawia typ skali FIT_CENTER:

Kotlin

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

Proces wyświetlania filmu obejmuje te etapy:

  1. Przeskaluj film:
    • W przypadku typów skali FIT_* skaluj film za pomocą funkcji min(dst.width/src.width, dst.height/src.height).
    • W przypadku typów skali FILL_* skaluj film za pomocą funkcji max(dst.width/src.width, dst.height/src.height).
  2. Dopasuj skalowany film do docelowego elementu PreviewView:
    • W przypadku elementu FIT_CENTER/FILL_CENTER wyśrodkuj skalowany film i miejsce docelowe (PreviewView).
    • W przypadku elementu FIT_START/FILL_START dopasuj skalowany film do miejsca docelowego PreviewView względem lewego górnego rogu każdej z nich.
    • W przypadku elementu FIT_END/FILL_END dopasuj skalowany film do miejsca docelowego PreviewView względem ich prawego dolnego rogu.

Na przykład film źródłowy o wymiarach 640 x 480 i miejsce docelowe o wymiarach 1920 x 1080 PreviewView:

Obraz przedstawiający film w rozdzielczości 640 x 480 w porównaniu z podglądem w rozdzielczości 1920 x 1080

Ten obraz przedstawia: FIT_START / FIT_CENTER / FIT_END proces skalowania:

Obraz przedstawiający proces skalowania FIT_START, FIT_CENTER i FIT_END

Proces ten wygląda tak:

  1. Przeskaluj klatkę wideo (z zachowaniem pierwotnego formatu obrazu) za pomocą parametru min(1920/640, 1080/480) = 2.25, aby uzyskać pośrednią klatkę wideo o rozdzielczości 1440 x 1080.
  2. Dopasuj klatkę wideo 1440 x 1080 do PreviewView 1920 x 1080.
    • W przypadku FIT_CENTER dopasuj ramkę wideo do środka Okno PreviewView. Początkowe i końcowe kolumny 240-pikselowe Pole PreviewView jest puste.
    • W przypadku FIT_START dopasuj klatkę filmu do miejsca początkowego (lewy górny róg) PreviewView. Końcowe kolumny 480 pikseli obiektu PreviewView są puste.
    • W przypadku FIT_END dopasuj klatkę wideo do końca (prawy dolny róg). PreviewView. Początkowe kolumny 480 pikseli Pole PreviewView jest puste.

Ten obraz przedstawia: FILL_START / FILL_CENTER / FILL_END proces skalowania:

Obraz przedstawiający proces skalowania FILL_START, FILL_CENTER i FILL_END

Proces ten wygląda tak:

  1. Przeskaluj klatkę wideo za pomocą elementu max(1920/640, 1080/480) = 3, aby uzyskać pośrednia klatka wideo o wymiarach 1920 x 1440 (która jest większa niż rozmiar PreviewView).
  2. Przytnij ramkę wideo o rozdzielczości 1920 x 1440, aby pasowała do okna PreviewView o rozdzielczości 1920 x 1080.
    • W przypadku FILL_CENTER przytnij wymiary 1920 x 1080 od środka 1920 x 1440 powiększony film. Górna i dolna 180 linii filmu nie są widoczne.
    • W przypadku elementu FILL_START przytnij obraz 1920 x 1080 od początku skali 1920 x 1440 film. Dolne 360 linii filmu nie jest widoczne.
    • W przypadku FILL_END przytnij rozmiar 1920 x 1080 od końca skali 1920 x 1440 film. 360 pierwszych wierszy filmu jest niewidoczne.

Dodatkowe materiały

Więcej informacji o aparacie Aparat X znajdziesz w dodatkowych materiałach poniżej.

Ćwiczenia z programowania

  • Pierwsze kroki z AparatemX
  • Przykładowy kod

  • Przykładowe aplikacje CameraX