使用Preview预览和自定义SurfaceView实现CameraX预览功能
添加依赖库
```
// CameraX
def camerax_version ="1.0.0"
implementation"androidx.camera:camera-core:${camerax_version}"
implementation"androidx.camera:camera-camera2:${camerax_version}"
implementation"androidx.camera:camera-lifecycle:${camerax_version}"
implementation"androidx.camera:camera-view:1.0.0-alpha24"
```
1、使用Preview预览,布局如下
```
<androidx.camera.view.PreviewView
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
代码设置,生命周期都自动管理
```
val cameraProviderFuture =ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider =cameraProviderFuture.get()
val preview =Preview.Builder().build()//创建preview
// 设置镜头
cameraType = CameraSelector.LENS_FACING_BACK//后置摄像头
val cameraSelector =CameraSelector.Builder().requireLensFacing(cameraType).build()
try {
//先解绑
cameraProvider.unbindAll()
//cameraPreview是布局的PreviewView,获取它的surfaceProvider
preview.setSurfaceProvider(bind.cameraPreview.surfaceProvider)
cameraProvider.bindToLifecycle(this, cameraSelector, preview)//绑定
}catch (e:Exception) {
}
},ContextCompat.getMainExecutor(this))
```
预览就完成,是不是很简单。
下面看使用SurfaceView如何实现
布局:
" ``````````````````````
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
`````````````````````````"
代码此处 preview.setSurfaceProvider(bind.cameraPreview.surfaceProvider),
修改如下即可
" ``````````````````````
preview.setSurfaceProvider(ContextCompat.getMainExecutor(application), //获取线程 object:Preview.SurfaceProvider{//创建SurfaceProvider
override fun onSurfaceRequested(request:SurfaceRequest) {
//设置surfaceView的surface
request.provideSurface(surfaceView.getHolder().getSurface(), mainExecutor, object :Consumer{
override fun accept(t:SurfaceRequest.Result) {//回调
Log.e("TAG","t : " + t.toString())
}} )}})
`````````````````````````"
这样就完成了。