Я использую CameraView из androidx компонентов, когда я использую метод takePicutre , для вызова требуется около 2 секундonImageSaved метод в ImageCapture.OnImageSavedListener слушатель, который заставляет пользователя чувствовать, что что-то не так.
вот мой код:
private fun takePicture() {
Log.d("ThreadRunning", Thread.currentThread().name)
val file = File(filesDir, UUID.randomUUID().toString())
val executor = Executors.newSingleThreadExecutor()
val startTime = System.currentTimeMillis()
cameraView?.takePicture(file, executor,
object : ImageCapture.OnImageSavedListener {
override fun onError(
error: ImageCapture.ImageCaptureError,
message: String,
exc: Throwable?
) {
runOnUiThread {
captureButton.visibility = View.VISIBLE
cameraView.visibility = View.VISIBLE
}
Log.d("CaptureClicked", "{$message}")
}
override fun onImageSaved(file: File) {
val bmOptions = BitmapFactory.Options()
var bitmap = BitmapFactory.decodeFile(file.absolutePath, bmOptions)
val displayMetrics = DisplayMetrics()
windowManager?.defaultDisplay?.getMetrics(displayMetrics)
//val width = displayMetrics.widthPixels
//val height = displayMetrics.heightPixels
val width = cameraView.width
val height = cameraView.height
val numratorValue = (height.toDouble() / width.toDouble()).roundToInt()
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true)
bitmap = if (cameraView.cameraLensFacing == CameraX.LensFacing.FRONT) {
bitmap.rotate(270F).mirror()
} else {
bitmap.rotate(90F)
}
runOnUiThread{
capturedImageView.setImageBitmap(bitmap)
capturedImageView.visibility = View.VISIBLE
cancelButton.visibility = View.VISIBLE
captureButton.visibility = View.INVISIBLE
}
Log.d("TestDelay", "${System.currentTimeMillis() - startTime}")
}
}
)
}
private fun Bitmap.rotate(degrees: Float): Bitmap {
val matrix = Matrix().apply {
postRotate(degrees)
}
return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}
private fun Bitmap.mirror(): Bitmap {
val matrix = Matrix().apply {
preScale(-1F, 1F)
}
return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}
А вотэто элемент xml для cameraView
<androidx.camera.view.CameraView
android:id="@+id/cameraView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:captureMode="image"/>
Еще один вопрос, когда я использую метод takePicture в Fragment , я получаю черный экран в течение 0,5 секунд, я думаю, из-заобъект lifecyclerOwner, но я не знаю, куда я должен поместить метод связывания, а где точно отсоединить его.
Итак, у меня есть два вопроса
1 - Почему просмотр камеры занимает слишком много времени, чтобысделать снимок и как уменьшить это время?
2 - Почему я получаю черный экран после вызова метода takePicutre при использовании Fragment ?