Как установить правильное соотношение сторон с помощью CameraX?
Я слежу за кодовой меткой CameraX и получаю неправильное соотношение сторон при предварительном просмотре, даже используя setTargetAspectRatio
а также setTargetResolution
методы.
private fun startCamera() {
// Create configuration object for the viewfinder use case
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio(Rational(1, 1))
setTargetResolution(Size(640, 640))
}.build()
...
И макет использует жестко закодированный размер, как представлено в кодовой метке.
<TextureView
android:id="@+id/view_finder"
android:layout_width="640px"
android:layout_height="640px"
...
Было бы хорошо, если бы библиотека CameraTextureView
и собственность android:scaleType
(аналогично существующему для ImageView
), чтобы настроить предварительный просмотр до размера предварительного просмотра.
https://stackru.com/images/3074aa66e38ebaeb0b7b95981a84846867c0bb66.png?s300
2 ответа
Ты пробовал это?
val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
val screenSize = Size(metrics.widthPixels, metrics.heightPixels)
val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)
val viewFinderConfig = PreviewConfig.Builder().apply {
//...
setTargetResolution(screenSize)
setTargetAspectRatio(screenAspectRatio)
setTargetRotation(viewFinder.display.rotation)
}.build()
val preview = AutoFitPreviewBuilder.build(viewFinderConfig, viewFinder)
И AutoFitPreviewBuilder вы можете найти здесь: https://gist.github.com/yevhenRoman/90681822adef43350844464be95d23f1
Я бы порекомендовал вам установить ширину и высоту для вашего TextureView, используя dp или constaraints. Дайте мне знать, если это работает для вас, спасибо!
Согласно официальной документации Android: "Нельзя устанавливать одновременно целевое соотношение сторон и целевое разрешение в одном варианте использования".
Хотя компилятор не выдает ошибку, если вы попытаетесь это сделать, могут возникнуть непредвиденные результаты.
/questions/40040479/predvaritelnyij-prosmotr-rastyagivaetsya-v-camera2-apis/40040480#40040480 есть решение аналогичной проблемы. После того, как вы выбрали разрешение, не используйтеsetTargetAspectRatio
функция; вместо этого вы должны использовать толькоsetTargetResolution
. Тогда он должен работать так же.
Вы можете установить соотношение сторон TextureView
с Matrix
как это:
Matrix txform = new Matrix();
textureView.getTransform(txform);
txform.setScale((float) = videoWidth / viewWidth, (float) videoHeight / viewHeight);// aspect ratio
textureView.setTransform(txform); // apply matrix