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:
- İsteğe bağlı olarak bir
CameraXConfig.Provider
yapılandırın. - Düzeninize
PreviewView
ekleyin. ProcessCameraProvider
isteyin.View
oluşturulduğundaProcessCameraProvider
olup olmadığını kontrol edin.- 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
vePreview.SurfaceProvider
için ayarlamak üzere birSurfaceTexture
oluşturun.SurfaceTexture
veri kümesiniTextureView
kaynağından alın vePreview.SurfaceProvider
üzerinde ayarlayın.SurfaceView
adlı satıcıdanSurface
alın vePreview.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:
Preview
oluşturun.- İstediğiniz kamera
LensFacing
seçeneğini belirtin. - Seçilen kamerayı ve varsa kullanım alanlarını yaşam döngüsüne bağlayın.
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:
- Önizleme akışlarını oluşturmak için uygulama modu.
- Önizleme resmi ölçek türü.
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 birSurfaceView
kullanır ancak bazı durumlardaTextureView
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 moddaPreviewView
,SurfaceView
'in aksine özel bir çizim yüzeyi olmayanTextureView
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çinFIT_END
. Tam video içeriği, hedefPreviewView
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:
- Videoyu ölçeklendirin:
FIT_*
ölçek türü için videoyumin(dst.width/src.width, dst.height/src.height)
ile ölçeklendirin.FILL_*
ölçek türü için videoyumax(dst.width/src.width, dst.height/src.height)
ile ölçeklendirin.
- Ölçeklendirilmiş videoyu
PreviewView
hedefine hizalayın:FIT_CENTER/FILL_CENTER
için, ölçeklendirilmiş videoyu ortaya vePreviewView
hedefine hizalayın.FIT_START/FILL_START
için, ölçeklendirilmiş videoyu vePreviewView
hedefini her birinin sol üst köşesine göre hizalayın.FIT_END/FILL_END
için, ölçeklendirilmiş videoyu ve hedefiPreviewView
, 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
:
Aşağıdaki resimde FIT_START
/ FIT_CENTER
/ FIT_END
ölçeklendirme işlemi gösterilmektedir:
Süreç şu şekilde işler:
- 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). - 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 karesiniPreviewView
penceresinin başlangıcı (sol üst köşe) ile hizalayın.PreviewView
öğesinin sondaki 480 piksellik sütunları boş.FIT_END
için, video karesiniPreviewView
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:
Süreç şu şekilde işler:
- 1920x1440 boyutunda (
PreviewView
boyutundan daha büyük) ara video karesi elde etmek için video karesinimax(1920/640, 1080/480) = 3
ile ölçeklendirin. - 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
Kod örneği