class PreviewView : FrameLayout
Custom View that displays the camera feed for CameraX's
Preview use case.
This class manages the preview
Surface's lifecycle. It internally uses either a
SurfaceView to display the camera feed, and applies required transformations on them to correctly display the preview, this involves correcting their aspect ratio, scale and rotation.
PreviewView uses a
SurfaceView to display the preview stream, be careful when overlapping a
View that's initially not visible (either
View#GONE) on top of it. When the
SurfaceView is attached to the display window, it calls
android.view.ViewParent#requestTransparentRegion(View) which requests a computation of the transparent regions on the display. At this point, the
View isn't visible, causing the overlapped region between the
SurfaceView and the
View to be considered transparent. Later if the
View becomes visible, it will not be displayed on top of
SurfaceView. A way around this is to call
android.view.ViewParent#requestTransparentRegion(View) right after making the
View visible, or initially hiding the
View by setting its opacity to 0, then setting it to 1.0F to show it.
The implementation mode of a
Options for scaling the preview vis-à-vis its container
Definitions for the preview stream state.
PreviewView(@NonNull context: Context)
@NonNull context: Context,
@Nullable attrs: AttributeSet?,
@UiThread @Nullable fun getBitmap(): Bitmap?
Do not invoke this method from a drawing method (
View#onDraw(Canvas) for instance).
If an error occurs during the copy, an empty
Bitmap will be returned.
If the preview hasn't started yet, the method may return null or an empty
getPreviewStreamState() to get the
StreamState and wait for
StreamState#STREAMING to make sure the preview is started.
@UiThread @NonNull fun getImplementationMode(): PreviewView.ImplementationMode
@UiThread @NonNull fun getMeteringPointFactory(): MeteringPointFactory
MeteringPointFactory is capable of creating
MeteringPoints from (x, y) coordinates in the
PreviewView. This conversion takes into account its
MeteringPointFactory is automatically adjusted if the
PreviewView layout or the
MeteringPointFactory returns invalid
MeteringPoint if the preview is not ready, or the
PreviewView dimension is zero. The invalid
MeteringPoint will cause
CameraControl#startFocusAndMetering(FocusMeteringAction) to fail but it won't crash the application. Wait for the
StreamState#STREAMING state to make sure the preview is ready.
@NonNull fun getPreviewStreamState(): LiveData<PreviewView.StreamState!>
There are two preview stream states,
StreamState#IDLE indicates the preview is currently not visible and streaming is stopped.
StreamState#STREAMING means the preview is streaming or is about to start streaming. This state guarantees the preview is visible only when the
ImplementationMode#COMPATIBLE. When in
ImplementationMode#PERFORMANCE mode, it is possible the preview becomes visible slightly after the state changes to