[英]How to mirror the PreviewView in CameraX?
免責聲明:我知道這個問題的存在,但它目前尚未解決,我正在嘗試提供額外的信息,而不用無用的答案污染那個信息,無論如何也無法解決問題。
我有一個自定義設備,前置攝像頭默認是鏡像的,所以想正常顯示預覽,需要水平翻轉 PreviewView 的內容,但是卡住了。 過去其他人建議使用PreviewView#setScaleX(-1)
,但它要么根本不起作用,要么需要在代碼中非常特定的位置調用,我還沒有找到。
下面的代碼是CameraFragment.kt
官方示例中CameraFragment.kt的簡化版; 我已經添加了評論,我已經厭倦了調用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
}
根據實現類型( COMPATIBLE
與PERFORMANCE
)和設備, PreviewView
可以使用TextureView
或SurfaceView
,在您的情況下,我假設PreviewView
正在使用SurfaceView
,您可以通過訪問PreviewView
的第一個孩子來確認這一點視圖( View.getChildAt(0)
)。
TextureView
就像任何其他View
一樣,這就是為什么當PreviewView
使用它時,將其 scaleX 設置為 -1 應該反映顯示的預覽。 您可以在創建布局后調用PreviewView.setScaleX(-1F)
(例如在onViewCreated()
中)。
使用SurfaceView
,這有點棘手,因為Surface
和View
在某些方面是獨立的: Surface
放置在包含View
的 window 后面,並且 View 層次結構通過在 window 中打孔來正確處理整個布局為了顯示SurfaceView
的Surface
。 這可以解釋為什么無法鏡像SurfaceView
顯示的內容,盡管我不確定為什么放大(scaleX 設置為值 > 1)和縮小(scaleX 設置為 0 和 1 之間的值)仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.