I have a PreviewView
that occupies the whole screen except for the toolbar.
The preview of the camera works great, but when I capture the image, the aspect ratio is complately different.
I would like to show the image to the user after it is successfully captured so it is the same size as the PreviewView
so I don't have to crop or stretch it.
Is it possible to change the aspect ratio so on every device it is the size of the PreviewView
or do I have to set it to a fixed value?
You can set the aspect ratio of the Preview
and ImageCapture
use cases while building them. If you set the same aspect ratio to both use cases, you should end up with a captured image that matches the camera preview output.
Example: Setting Preview
and ImageCapture
's aspect ratios to 4:3
Preview preview = new Preview.Builder()
.setTargetAspectRatio(AspectRatio.RATIO_4_3)
.build();
ImageCapture imageCapture = new ImageCapture.Builder()
.setTargetAspectRatio(AspectRatio.RATIO_4_3)
.build();
By doing this, you'll most likely still end up with a captured image that doesn't match what PreviewView
is displaying. Assuming you don't change the default scale type of PreviewView
, it'll be equal to ScaleType.FILL_CENTER
, meaning that unless the camera preview output has an aspect ratio that matches that of PreviewView
, PreviewView
will crop parts of the preview (the top and bottom, or the right and left sides), resulting in the captured image not matching what PreviewView
displays. To solve this issue, you should set PreviewView
's aspect ratio to the same aspect ratio as the Preview
and ImageCapture
use cases.
Example: Setting PreviewView
's aspect ratio to 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>