繁体   English   中英

如何在 Android 中冻结 cameraX 预览?

[英]how can I freeze cameraX preview in Android?

我希望相机在按下图像捕获按钮时冻结预览。 我看过其他堆栈溢出问题,但它们已经过时了。

我正在使用的 cameraX 版本:1.0.0-beta03

任何帮助将不胜感激。 谢谢

目前还没有“正确”的方法来做到这一点,但实现它的几种方法包括:

  • 通过取消绑定Preview用例停止预览 stream,拍照,然后绑定Preview用例以继续预览 stream。 要使这种方法起作用,您还需要绑定ImageAnalysis用例,因为如果ImageCapture是唯一绑定的用例,则无法拍照(还必须绑定另一个PreviewImageAnalysis用例,请查看官方文档关于可能的用例组合)。 虽然这种方法有效,但它会导致在调用ImageCapture回调的那一刻与继续预览时之间存在轻微延迟,在此期间屏幕将是空白的。

  • 在您拍照时,使用ImageAnalysis中的最新帧将其显示在预览的顶部,您可以将帧(即ImageProxy )转换为Bitmap并将其显示在ImageView中。 调用ImageCapture回调后,删除框架并继续预览。

编辑:

从相机视图版本 1.0.0-alpha12 开始,您可以使用PreviewView.getBitmap()获得预览的Bitmap表示。 使用此方法,您可以获得用户拍照时预览的Bitmap表示,将其显示在ImageView中的预览顶部,然后一旦图像捕获结果可用,隐藏图像。

此外,我认为您可以尝试创建(作为解决方法)自定义 LifecycleOwner 包装器,并在您想暂停预览时手动将生命周期 state 设置为 ON_PAUSE。 所以它会是这样的:

class CameraXLifecycleOwner : LifecycleOwner {

    private val lifecycle = LifecycleRegistry(this)

    private val observer = object : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onResume() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun onStart() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        fun onPause() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun onStop() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy() {
            lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        }
}

fun attachLifecycleOwner(lifecycleOwner: LifecycleOwner) {
    lifecycle.currentState = lifecycleOwner.lifecycle.currentState
    lifecycleOwner.lifecycle.addObserver(observer)
}

fun detachLifecycleOwner(lifecycleOwner: LifecycleOwner) {
    lifecycleOwner.lifecycle.removeObserver(observer)
}

fun pauseCamera() {
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
}

fun resumeCamera() {
    lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
}

override fun getLifecycle(): Lifecycle = lifecycle

}

因此,然后您通过将默认片段的 viewLifecycleOwner 传递给 attachLifecycleOwner() 来包装它,这样包装器将重复所有 viewLifecycleOwner 的状态,但是您也可以调用 pauseCamera()/resumeCamera() 手动更改 state 伪造 onPause/onResume Z9ED39E29EA931586A76A 不确定这是不是最好的主意,但这是一个主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM