实现预览
在向应用添加预览时,请使用 PreviewView,这是一种可以剪裁、缩放和旋转以确保正确显示的 View
。
当相机处于活动状态时,图片预览会流式传输到 PreviewView
中的 Surface。
使用 PreviewView
如需使用 PreviewView
实现 CameraX 预览,请按以下步骤操作(稍后将对这些步骤进行说明):
- (可选)配置 CameraXConfig.Provider。
- 将
PreviewView
添加到布局。 - 请求 ProcessCameraProvider。
- 在创建
View
时,请检查ProcessCameraProvider
。 - 选择相机并绑定生命周期和用例。
使用 PreviewView
存在一些限制。使用 PreviewView
时,您无法执行以下任何操作:
- 创建
SurfaceTexture
,以在TextureView
和 Preview.SurfaceProvider 上进行设置。 - 从
TextureView
检索SurfaceTexture
,并在Preview.SurfaceProvider
上对其进行设置。 - 从
SurfaceView
获取Surface
,并在Preview.SurfaceProvider
上对其进行设置。
如果出现上述任何一种情况,Preview
就会停止将帧流式传输到 PreviewView
。
[可选] 配置 CameraXConfig.Provider
如果您希望对初始化 CameraX 的时间进行精细控制,您可以在 Application
类中实现 CameraXConfig.Provider
接口。请注意,大多数应用并不需要这种级别的控制。
import androidx.camera.camera2.Camera2Config; import androidx.camera.core.CameraXConfig; public class MyCameraXApplication extends Application implements CameraXConfig.Provider { @NonNull @Override public CameraXConfig getCameraXConfig() { return Camera2Config.defaultConfig(); } }
将 PreviewView 添加到布局
以下示例显示了布局中的 PreviewView
:
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
请求 CameraProvider
以下代码展示了如何请求 CameraProvider
:
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 可用性
请求 CameraProvider
后,请验证它能否在视图创建后成功初始化。以下代码展示了如何执行此操作:
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));
如需查看此示例中使用的 bindPreview
函数的示例,请参阅下一部分中提供的代码。
选择相机并绑定生命周期和用例
创建并确认 CameraProvider
后,请执行以下操作:
- 创建
Preview
。 - 指定所需的相机
LensFacing
选项。 - 将所选相机和任意用例绑定到生命周期。
- 将
Preview
连接到PreviewView
。
以下代码展示了一个示例:
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); }
现在,您已完成实现相机预览的操作。请构建您的应用,然后确认预览是否出现在您的应用中并能按预期工作。
其他资源
如需详细了解 CameraX,请参阅下面列出的其他资源。