У меня есть поток с моей пользовательской камерой CameraX, такой как:
- Открыть предварительный просмотр камеры (в режиме реального времени)
- Нажмите кнопку, чтобы сделать фотографию
- Пройдите процесс при нажатии на эту кнопку (преобразовать путь в растровое изображение, повернуть изображение, автоматически обрезать изображение, сохранить на устройстве)
- После успешного завершения всего процесса отправьте изображение в другой фрагмент и отобразите его в виде глиссады.
Вопрос в том, когда running all the process (in step 3)
имеет delayed 2 seconds
и предварительный просмотр камеры все еще live
(not freeze
или lock
). Как сделать camera preview freeze or lock when running the process
?
Вот мой код для запуска предварительного просмотра камеры в Camera X:
class CameraFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_camera, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewFinder.post { setupCamera() }
}
private fun setupCamera() {
CameraX.unbindAll()
CameraX.bindToLifecycle(
this,
buildPreviewUseCase(),
buildImageCaptureUseCase()
)
}
private fun buildPreviewUseCase(): Preview {
val preview = Preview(
UseCaseConfigBuilder.buildPreviewConfig(
viewFinder.display
)
)
preview.setOnPreviewOutputUpdateListener { previewOutput ->
updateViewFinderWithPreview(previewOutput)
correctPreviewOutputForDisplay(previewOutput.textureSize)
}
return preview
}
private fun buildImageCaptureUseCase(): ImageCapture {
val capture = ImageCapture(
UseCaseConfigBuilder.buildImageCaptureConfig(
viewFinder.display
)
)
cameraCaptureImageButton.setOnClickListener {
capture.takePicture(
FileCreator.createTempFile(JPEG_FORMAT),
Executors.newSingleThreadExecutor(),
object : ImageCapture.OnImageSavedListener {
override fun onImageSaved(file: File) {
// I want make a freeze camera preview when execute this before launch *launchGalleryFragment(path)*
val bitmap = BitmapFactory.decodeFile(file.absolutePath)
val rotatedBitmap = bitmap.rotate(90)
val croppedImage = cropImage(rotatedBitmap, viewFinder, rectangle)
val path = saveImage(croppedImage)
requireActivity().runOnUiThread {
launchGalleryFragment(path)
}
}
override fun onError(
imageCaptureError: ImageCapture.ImageCaptureError,
message: String,
cause: Throwable?
) {
Toast.makeText(requireContext(), "Error: $message", Toast.LENGTH_LONG)
.show()
Log.e("CameraFragment", "Capture error $imageCaptureError: $message", cause)
}
})
}
return capture
}
private fun launchGalleryFragment(path: String) {
val action = CameraFragmentDirections.actionLaunchGalleryFragment(path)
findNavController().navigate(action)
}
}