9

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

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

我发现当我用小值调用它时,可以放大图片,例如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)      
    }
4

3 回答 3

4

这不是传统的问题,而是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)适用于捏缩放手势)。

按比例设置当前缩放。

它会同时修改当前的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)

在我的摩托罗拉 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
于 2019-12-29T05:10:43.893 回答
0

这是 Android 的传统,缩放级别存在于许多其他值0之间。1

0表示最低缩放级别。

1表示最大缩放级别。

这是一个浮点值,因此您可以像0.10.2等一样增加它0.9

于 2019-11-17T16:27:43.753 回答
0

首先,找出相机的最大变焦值——使用getMaxZoom()方法。

https://developer.android.com/reference/android/hardware/Camera.Parameters.html#getMaxZoom()

如果您使用过相机预览,那么您可以使用Rect. 如下图——

PreviewConfig config = new PreviewConfig.Builder().build();
    Preview preview = new Preview(config);

    Rect rect = Rect(left, top, right, bottom);
    preview.zoom(rect)

    preview.setOnPreviewOutputUpdateListener(
        new Preview.OnPreviewOutputUpdateListener() {
            @Override
            public void onUpdated(Preview.PreviewOutput previewOutput) {
                // Your code here. For example, use previewOutput.getSurfaceTexture()
                // and post to a GL renderer.
            };
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, preview);

您可以从这里获得更多详细信息 -使用双指触摸的 Android 相机预览缩放

于 2019-11-26T04:22:44.023 回答