Android CameraX同设备多路预览显示内容不一致问题求助
问题根因
- 两个PreviewView的宽高比不一致:左预览宽高比约为0.77,右预览约为0.79,
fitCenter模式下会各自根据自身尺寸裁剪相机原始画面,导致显示区域不同 - 多数场景下是为两个PreviewView分别创建了独立的Preview用例,两个用例的输出裁剪策略没有做统一配置
解决步骤
- 统一两个PreviewView的宽高参数,保证二者宽高比完全一致,XML修改参考:
<androidx.camera.view.PreviewView android:id="@+id/viewFinderLeft" android:layout_width="330dp" android:layout_height="425dp" android:scaleType="fitCenter" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.camera.view.PreviewView android:id="@+id/viewFinderRight" android:layout_width="330dp" android:layout_height="425dp" android:scaleType="fitCenter" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
- 全局只创建一个Preview用例,统一配置裁剪参数,同时绑定到两个PreviewView,业务代码参考(Kotlin):
// 固定预览输出比例,和View的宽高比匹配 val preview = Preview.Builder() .setTargetAspectRatio(AspectRatio.RATIO_4_3) .build() // 同一个Surface请求同时分发到两个预览View preview.setSurfaceProvider { request -> viewFinderLeft.surfaceProvider.onSurfaceRequested(request) viewFinderRight.surfaceProvider.onSurfaceRequested(request) } // 绑定用例到相机生命周期 cameraProvider.bindToLifecycle(this, cameraSelector, preview)
- 如果你使用的CameraX版本低于1.2.0不支持多Surface输出,可以将相机输出先渲染到一个离屏TextureView,再将TextureView的画面同时绘制到两个显示控件上,也能保证两个预览画面完全一致。
内容的提问来源于stack exchange,提问作者Hinson Chan
相关产品推荐
相关产品推荐

