簡體   English   中英

如何在 CameraX 中鏡像 PreviewView?

[英]How to mirror the PreviewView in CameraX?

免責聲明:我知道這個問題的存在,但它目前尚未解決,我正在嘗試提供額外的信息,而不用無用的答案污染那個信息,無論如何也無法解決問題。

我有一個自定義設備,前置攝像頭默認是鏡像的,所以想正常顯示預覽,需要水平翻轉 PreviewView 的內容,但是卡住了。 過去其他人建議使用PreviewView#setScaleX(-1) ,但它要么根本不起作用,要么需要在代碼中非常特定的位置調用,我還沒有找到。

下面的代碼是CameraFragment.kt官方示例中CameraFragment.kt的簡化版 我已經添加了評論,我已經厭倦了調用viewFinder.scaleX = -1f但沒有成功。 老實說,我真的不認為這個地方有什么不同,因為如果我用 1 以外的任何值調用它,它與scaleXscaleY都可以正常工作,但它總是忽略負號,所以它永遠不會翻轉。

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
}

根據實現類型( COMPATIBLEPERFORMANCE )和設備, PreviewView可以使用TextureViewSurfaceView ,在您的情況下,我假設PreviewView正在使用SurfaceView ,您可以通過訪問PreviewView的第一個孩子來確認這一點視圖( View.getChildAt(0) )。

TextureView就像任何其他View一樣,這就是為什么當PreviewView使用它時,將其 scaleX 設置為 -1 應該反映顯示的預覽。 您可以在創建布局后調用PreviewView.setScaleX(-1F) (例如在onViewCreated()中)。

使用SurfaceView ,這有點棘手,因為SurfaceView在某些方面是獨立的: Surface放置在包含View的 window 后面,並且 View 層次結構通過在 window 中打孔來正確處理整個布局為了顯示SurfaceViewSurface 這可以解釋為什么無法鏡像SurfaceView顯示的內容,盡管我不確定為什么放大(scaleX 設置為值 > 1)和縮小(scaleX 設置為 0 和 1 之間的值)仍然有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM