Saat menambahkan pratinjau ke aplikasi Anda, gunakan
PreviewView, yang merupakan
View yang dapat dipangkas, diskalakan, dan diputar untuk memperoleh tampilan yang tepat.
Pratinjau gambar melakukan streaming ke platform di dalam PreviewView saat
kamera mulai aktif.
Menggunakan PreviewView
Mengimplementasikan pratinjau untuk CameraX menggunakan PreviewView melibatkan
langkah-langkah berikut, yang dibahas di bagian selanjutnya:
- Secara opsional, konfigurasikan
CameraXConfig.Provider.
- Tambahkan PreviewViewke tata letak Anda.
- Minta
ProcessCameraProvider.
- Pada pembuatan View, periksaProcessCameraProvider.
- Pilih kamera, lalu ikatkan siklus proses dan kasus penggunaannya.
Penggunaan PreviewView memiliki beberapa batasan. Saat menggunakan PreviewView, Anda tidak dapat
melakukan hal-hal berikut:
- Membuat SurfaceTextureuntuk ditetapkan padaTextureViewdanPreview.SurfaceProvider.
- Mengambil SurfaceTexturedariTextureViewdan menetapkannya padaPreview.SurfaceProvider.
- Mendapatkan SurfacedariSurfaceViewdan menetapkannya padaPreview.SurfaceProvider.
Jika salah satu dari hal tersebut terjadi, Preview akan menghentikan frame streaming ke
PreviewView.
Menambahkan PreviewView ke tata letak
Contoh berikut menunjukkan PreviewView dalam tata letak:
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
Meminta CameraProvider
Kode berikut menunjukkan cara meminta file 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); } }
Memeriksa ketersediaan CameraProvider
Setelah meminta CameraProvider, verifikasi bahwa inisialisasinya berhasil
saat tampilan dibuat. Kode berikut menunjukkan cara melakukannya:
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));
Untuk contoh fungsi bindPreview yang digunakan dalam contoh ini, lihat kode
yang diberikan di bagian berikutnya.
Memilih kamera serta mengikat siklus proses dan kasus penggunaan
Setelah membuat dan mengonfirmasi CameraProvider, lakukan langkah berikut:
- Buat Preview.
- Tentukan opsi LensFacingkamera yang diinginkan.
- Ikatkan kamera yang dipilih dan kasus penggunaan ke siklus proses.
- Hubungkan PreviewkePreviewView.
Kode berikut menampilkan contoh:
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); }
Perhatikan bahwa bindToLifecycle() menampilkan objek
Camera. Untuk mengetahui informasi selengkapnya tentang mengontrol output kamera, seperti zoom dan eksposur, lihat Output kamera.
Kini Anda telah selesai menerapkan pratinjau kamera. Buat aplikasi dan konfirmasi bahwa pratinjau muncul di aplikasi dan berfungsi seperti yang Anda harapkan.
Kontrol tambahan untuk PreviewView
CameraX PreviewView menyediakan beberapa API tambahan untuk mengonfigurasi properti
seperti:
- Mode penerapan untuk merender streaming pratinjau.
- Jenis skala gambar pratinjau.
Mode penerapan
PreviewView dapat menggunakan salah satu mode berikut untuk merender streaming pratinjau ke
View target:
- PERFORMANCEadalah mode default.- PreviewViewmenggunakan- SurfaceViewuntuk menampilkan streaming video, tetapi kembali ke- TextureViewdalam kasus tertentu.- SurfaceViewmemiliki platform gambar khusus, yang memiliki peluang lebih besar untuk diterapkan dengan overlay hardware oleh compositor hardware internal, terutama saat tidak ada elemen UI lain (seperti tombol) di atas video pratinjau. Dengan rendering menggunakan overlay hardware, frame video menghindari jalur GPU, yang dapat mengurangi konsumsi daya platform dan latensi.
- Mode - COMPATIBLE. Tidak seperti- SurfaceView, dalam mode ini- PreviewViewmenggunakan- TextureView, yang tidak memiliki platform gambar khusus. Akibatnya, video dirender dengan penggabungan agar dapat ditampilkan. Selama langkah tambahan ini, aplikasi dapat melakukan pemrosesan tambahan, seperti menskalakan dan memutar video tanpa batasan.
Gunakan PreviewView.setImplementationMode()
untuk memilih mode penerapan yang cocok untuk aplikasi Anda. Jika mode
PERFORMANCE default tidak cocok untuk aplikasi Anda, contoh
kode berikut menunjukkan cara menetapkan mode COMPATIBLE:
Kotlin
// viewFinder is a PreviewView instance viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
Jenis skala
Jika resolusi video pratinjau berbeda dengan dimensi
PreviewView target Anda, konten video harus disesuaikan dengan tampilan baik dengan pemangkasan atau
tampilan lebar (mempertahankan rasio aspek asli). PreviewView menyediakan
ScaleTypes berikut untuk tujuan ini:
- FIT_CENTER,- FIT_START, dan- FIT_ENDuntuk tampilan lebar. Konten video lengkap akan diskalakan (baik ke atas atau ke bawah) ke ukuran maksimum yang dapat ditampilkan di- PreviewViewtarget. Namun, meskipun frame video lengkap terlihat, beberapa bagian layar mungkin kosong. Bergantung pada ketiga jenis skala tersebut, frame video selaras dengan bagian tengah, awal, atau akhir View target.
- FILL_CENTER,- FILL_START,- FILL_ENDuntuk pemangkasan. Jika video tidak cocok dengan rasio aspek- PreviewView, hanya sebagian konten yang akan terlihat, tetapi video akan mengisi seluruh- PreviewView.
Jenis skala default yang digunakan CameraX adalah FILL_CENTER. Gunakan PreviewView.setScaleType()
untuk menetapkan jenis skala yang paling sesuai untuk aplikasi Anda. Contoh kode berikut
menetapkan jenis skala FIT_CENTER:
Kotlin
// viewFinder is a PreviewView instance viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER
Proses menampilkan video terdiri dari langkah-langkah berikut:
- Skalakan video:
- Untuk jenis skala FIT_*, skalakan video denganmin(dst.width/src.width, dst.height/src.height).
- Untuk jenis skala FILL_*, skalakan video denganmax(dst.width/src.width, dst.height/src.height).
 
- Untuk jenis skala 
- Selaraskan video yang diskalakan dengan PreviewViewtujuan:- Untuk FIT_CENTER/FILL_CENTER, sejajarkan ke tengah video yang diskalakan danPreviewViewtujuan.
- Untuk FIT_START/FILL_START, selaraskan video yang diskalakan danPreviewViewtujuan sehubungan dengan sudut kiri atas masing-masing.
- Untuk FIT_END/FILL_END, selaraskan video yang diskalakan danPreviewViewtujuan sehubungan dengan sudut kanan bawah masing-masing video.
 
- Untuk 
Misalnya, berikut adalah video sumber 640x480 dan PreviewView tujuan
1920x1080:

Gambar berikut menunjukkan proses penskalaan
FIT_START/FIT_CENTER/FIT_END:

Prosesnya seperti ini:
- Skalakan frame video (mempertahankan rasio aspek asli) dengan min(1920/640, 1080/480) = 2.25untuk mendapatkan frame video menengah berukuran 1440x1080.
- Selaraskan frame video 1440x1080 dengan PreviewView1920x1080.- Untuk FIT_CENTER, selaraskan frame video dengan bagian tengah jendelaPreviewView. Kolom 240 piksel awal dan akhirPreviewViewkosong.
- Untuk FIT_START, selaraskan frame video dengan awal (sudut kiri atas) jendelaPreviewView. Kolom 480 piksel akhirPreviewViewkosong.
- Untuk FIT_END, selaraskan frame video dengan akhir (sudut kanan bawah) jendelaPreviewView. Kolom 480 piksel awalPreviewViewkosong.
 
- Untuk 
Gambar berikut menunjukkan proses penskalaan
FILL_START/FILL_CENTER/FILL_END:

Prosesnya seperti ini:
- Skalakan frame video dengan max(1920/640, 1080/480) = 3untuk mendapatkan frame video menengah berukuran 1920x1440 (yang lebih besar dari ukuranPreviewView).
- Pangkas frame video 1920x1440 agar sesuai dengan jendela PreviewView1920x1080.- Untuk FILL_CENTER, pangkas gambar berukuran 1920x1080 dari bagian tengah video yang diskalakan dengan ukuran 1920x1440. Baris 180 atas dan bawah video tidak terlihat.
- Untuk FILL_START, pangkas ukuran 1920x1080 dari awal video yang diskalakan dengan ukuran 1920x1440. Baris 360 atas video tidak terlihat.
- Untuk FILL_END, pangkas ukuran 1920x1080 dari akhir video yang diskalakan dengan ukuran 1920x1440. Baris 360 atas video tidak terlihat.
 
- Untuk 
Referensi lainnya
Untuk mempelajari CameraX lebih lanjut, lihat referensi tambahan berikut.
Codelab
Contoh kode
