Отказ от ответственности: мне известно о существовании этого вопроса, но в настоящее время он остается нерешенным и Я пытаюсь предоставить дополнительную информацию, не засоряя ее бесполезными ответами, которые все равно не решат проблему.
У меня есть настраиваемое устройство с фронтальной камерой, которая по умолчанию зеркалируется, поэтому я хочу отображать предварительный просмотр в обычном режиме, и мне нужно горизонтально перевернуть содержимое PreviewView, но я застрял. Другие люди в прошлом предлагали использовать PreviewView#setScaleX(-1)
, но он либо вообще не работает, либо его нужно вызывать в очень конкретном месте кода, которого я еще не нашел.
Приведенный ниже код представляет собой упрощенную версию CameraFragment.kt
в официальном Пример CameraXBasic; Я добавил комментарии, где я уже устал звонить viewFinder.scaleX = -1f
безуспешно. Честно говоря, я не думаю, что это место имеет значение, потому что, если я вызываю его с любым значением, отличным от 1, он отлично работает как с scaleX
, так и с scaleY
, но он всегда игнорирует отрицательный знак, поэтому он никогда не переворачивает.
private lateinit var viewFinder: PreviewView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
viewFinder = view.findViewById(R.id.view_finder)
// HERE
viewFinder.post {
// HERE
setupCamera()
}
}
private fun setupCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build()
val preview = Preview.Builder()
.build()
.also {
// HERE
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
cameraProvider.unbindAll()
try {
cameraProvider.bindToLifecycle(this, cameraSelector, preview)
// HERE
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
// HERE
}, ContextCompat.getMainExecutor(requireContext()))
// HERE
}