机票直达
Android CameraX 详解一 (引言&基础)
Android CameraX 详解二 (实时预览)
Android CameraX 详解三 (拍照)
Android CameraX 详解四 (图片分析)
Android CameraX 详解五(视频拍摄录制)
实时预览
在向应用添加预览时,请使用PreviewView
这是一种可以剪裁、缩放和旋转以确保正确显示的 View
。
当相机处于活动状态时,图片预览会流式传输到 PreviewView
中的 Surface
使用PreviewView
如需使用 PreviewView
实现 CameraX 预览,请按以下步骤操作
- 申请camera权限
- 将
PreviewView
添加到布局
<FrameLayout
android:id="@+id/container">
<androidx.camera.view.PreviewView
android:id="@+id/previewView" />
</FrameLayout>
- 创建
ProcessCameraProvider
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)
}
}
- 在创建
View
时,请检查ProcessCameraProvider
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))
- 选择相机并绑定生命周期和用例
fun bindPreview(cameraProvider : ProcessCameraProvider) {
val preview = Preview.Builder() .build()
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
preview.setSurfaceProvider(previewView.getSurfaceProvider())
cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}
-
bindToLifecycle()
会返回一个Camera
对象,可以控制相机输出(如变焦和曝光),完成以上步骤,即可实现相机预览
PreviewView的渲染模式
PreviewView
可以使用以下模式之一将预览流渲染到目标 View
上:
PERFORMANCE
是默认模式。PreviewView
会使用SurfaceView
显示视频串流,但在某些情况下会回退为使用TextureView
。SurfaceView
具有专用的绘图界面,该对象更有可能通过内部硬件合成器实现硬件叠加层,尤其是当预览视频上面没有其他界面元素(如按钮)时。通过使用硬件叠加层进行渲染,视频帧会避开 GPU 路径,从而能降低平台功耗并缩短延迟时间。COMPATIBLE
模式。在此模式下,PreviewView
会使用TextureView
;不同于SurfaceView
,该对象没有专用的绘图表面。因此,视频要通过混合渲染,才能显示。在这个额外的步骤中,应用可以执行额外的处理工作,例如不受限制地缩放和旋转视频。
您可以使用 PreviewView.setImplementationMode()
选择适合具体应用的实现模式。如果默认的 PERFORMANCE
模式不适合您的应用,请参阅以下代码示例,了解如何设置 COMPATIBLE
模式:
// previewView is a PreviewView instance
previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
PreviewView的缩放模式
当预览视频分辨率与目标 PreviewView
的尺寸不同时,视频内容需要通过剪裁操作或添加遮幅式黑边来适应视图(保持原始宽高比)。为此,PreviewView
提供了以下 ScaleTypes
:
FIT_CENTER
、FIT_START
和FIT_END
,用于添加遮幅式黑边。整个视频内容会调整(放大或缩小)为可在目标PreviewView
中显示的最大尺寸。不过,虽然整个视频帧会完整显示,但屏幕画面中可能会出现空白部分。视频帧会与目标视图的中心、起始或结束位置对齐,具体取决于您在上述三种缩放类型中选择了哪一种。FILL_CENTER
、FILL_START
和FILL_END
,用于进行剪裁。如果视频的宽高比与PreviewView
不匹配,画面中只会显示部分内容,但视频仍会填满整个PreviewView
。
CameraX 使用的默认缩放类型是 FILL_CENTER
。您可以使用 PreviewView.setScaleType()
设置最适合具体应用的缩放类型。下面的代码示例设置了 FIT_CENTER
缩放类型:
// previewView is a PreviewView instance
previewView.scaleType = PreviewView.ScaleType.FIT_CENTER