我正在使用camera2在我的应用程序中制作相机,我想使用CameraViewfinder,据我所知,它应该处理纠正方向和纵横比。但是,当我设置其分辨率并请求表面时,预览会垂直拉伸。我使用的分辨率是 3072x4080 (3:4),并且宽高比与取景器不匹配,因此看起来不正确。但是,我认为 CameraViewfinder 应该自动纠正这个问题?我正在使用
fillCenter
比例类型,其文档如下:
如果相机取景器的纵横比与其容器CameraViewfinder的纵横比不匹配,这可能会导致取景器被裁剪。
但是,我没有看到任何裁剪来纠正宽高比。这就是我请求预览表面的方式:
surfaceRequest = ViewfinderSurfaceRequest.Builder(
resolution = resolution // Size(3072, 4080)
).build()
surfaceRequest?.let { request ->
val surfaceListenableFuture: ListenableFuture<Surface> =
binding.viewFinder.requestSurfaceAsync(request)
Futures.addCallback(
surfaceListenableFuture, object : FutureCallback<Surface> {
override fun onSuccess(result: Surface?) {
// use surface
}
},
ContextCompat.getMainExecutor(requireContext())
)
}
我将取景器包裹在
FrameLayout
中,并在我的 XML 中定义如下:
<androidx.camera.viewfinder.CameraViewfinder
android:id="@+id/view_finder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="92dp"
android:layout_marginTop="64dp"
app:scaleType="fillCenter" />
我的视图上有边距,因为我的相机 UI 中有顶部/底部栏。
我尝试获取取景器的纵横比,然后找到纵横比最接近的分辨率,但预览仍然失真。我需要做什么来纠正预览中的宽高比?
找出问题所在。我需要在
populateFromCharacteristics(characteristics)
上调用 ViewfinderSurfaceRequest.Builder
,以便它具有相机正确显示预览的所有特征。如果谷歌更新他们的文档以表明这是一个必要的步骤,那就太好了。完整代码如下:
surfaceRequest = ViewfinderSurfaceRequest.Builder(photoPreviewUIModel.resolution)
.populateFromCharacteristics(characteristics)
.build()