我有一个PreviewView,除了工具栏外,它都占据了整个屏幕。
相机的预览效果很好,但是当我捕获图像时,纵横比完全不同。
我想在成功捕获图像后向用户显示该图像,因此它的大小与PreviewView相同,因此不必裁剪或拉伸(stretch)它。
是否可以更改长宽比,以便在每个设备上设置PreviewView的大小,还是必须将其设置为固定值?

最佳答案

您可以在构建PreviewImageCapture用例时设置其纵横比。如果在两个用例中都设置了相同的纵横比,则最终应获得与相机预览输出匹配的捕获图像。
示例:将PreviewImageCapture的纵横比设置为4:3

Preview preview = new Preview.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .build();
ImageCapture imageCapture = new ImageCapture.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .build();
这样,您很可能最终仍会捕获到与PreviewView显示的图像不匹配的图像。假设您没有更改PreviewView的默认比例类型,它将等于ScaleType.FILL_CENTER,这意味着除非相机预览输出的长宽比与PreviewView匹配,否则PreviewView将裁剪预览的一部分(顶部和底部) ,或左右两侧),导致捕获的图像与PreviewView显示的图像不匹配。要解决此问题,您应该将PreviewView的长宽比设置为与PreviewImageCapture用例相同的长宽比。
示例:将PreviewView的长宽比设置为4:3
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.camera.view.PreviewView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintDimensionRatio="3:4"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

10-08 18:02