为什么 CameraX 不能在 Android Studio 中将图片放大到我需要的大小?

Hel*_*oCW 9 android zooming kotlin android-camerax

我正在学习 CameraX,CameraXBasic是示例代码。

我写了一个基于zoomX函数的CameraFragment.kt。你可以看到代码A。我认为该功能可以随时放大图片。

我发现一个画面可以当我是变焦调用它与SA小的值,例如zoomX(2f)zoomX(3f),但画面不会放大当我再次用大值,比如zoomX(6.0f)zoomX(7.0f)为什么?

代码 A

   private lateinit var viewFinder: TextureView 
    private var preview: Preview? = null

    fun zoomX(orign: Float ){       
        val x=orign+1

        val singleWidth=viewFinder.width/x
        val singleHeight=viewFinder.height/x

        val left=viewFinder.width/2f-singleWidth/2f
        val right=left+singleWidth
        val top=viewFinder.height/2f-singleHeight/2f
        val bottom=top+singleHeight

        val my= Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
        preview?.zoom(my)      
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 5

这不是传统的问题,而是传统的问题Futures。将CameraXBasic示例从更新为1.0.0-alpha061.0.0-alpha08破坏很多内容,但 CameraX CameraControl 具有以下两种方法:

通过范围从0f到 的线性缩放值设置当前缩放1.0f

linearZoom 0f代表最小变焦,linearZoom 1.0f代表最大变焦。其优点linearZoom是,它确保视野 (FOV) 随值线性变化linearZoom,适用于滑块 UI 元素(同时setZoomRatio(float)适用于捏缩放手势)。

按比例设置当前缩放比例。

它会修改 current zoomRatiolinearZoom因此如果应用程序正在观察zoomRatiolinearZoom,它们也会获得更新。如果比例小于CameraInfo.getMinZoomRatio()或大于CameraInfo.getMaxZoomRatio(),返回ListenableFuture将失败,IllegalArgumentException并且不会修改当前缩放比例。应用程序有责任限制该比率。

另请参阅Executor,还有CameraXExecutors.


另请参阅发行说明提交...了解所有 API 更改,这些更改破坏了 CameraXBasic 示例。我不会再解释这些 API 差异(因为这不是问题),但已经分叉了;请参阅问题#131(到目前为止,至少预览版可以运行)。


它实际上是这样工作的:

val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)
Run Code Online (Sandbox Code Playgroud)

在我的 Motorola XT1900 上使用1.0f之前的变焦比:8.0f

val info: CameraInfo = camera.cameraInfo
val cameraId = (info as Camera2CameraInfoImpl).cameraId
val zoomRatio = info.getZoomRatio().value
val maxZoomRatio = info.getMaxZoomRatio().value
val minZoomRatio = info.getMinZoomRatio().value
val linearZoom = info.getLinearZoom().value
Run Code Online (Sandbox Code Playgroud)