我正在学习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)
}
答案 0 :(得分:2)
这不是传统问题,而是Futures
。将CameraXBasic的示例从1.0.0-alpha06
更新为1.0.0-alpha08
会遇到很多麻烦,但是CameraX CameraControl具有以下两种方法:
通过介于
0f
到1.0f
之间的线性缩放值设置当前缩放。
linearZoom 0f
表示最小缩放,而linearZoom 1.0f
表示最大缩放。linearZoom
的优点在于,它可以确保视场(FOV)随linearZoom
值线性变化,以便与滑块UI元素一起使用(而setZoomRatio(float)
可以很好地捏住缩放手势)。
设置当前缩放比例。
它同时修改了当前的
zoomRatio
和linearZoom
,因此,如果应用程序正在观察zoomRatio
或linearZoom
,它们也会获得更新。如果该比例小于CameraInfo.getMinZoomRatio()
或大于CameraInfo.getMaxZoomRatio()
,则返回的ListenableFuture
将失败,并显示IllegalArgumentException
,并且不会修改当前的缩放比例。限制比率是应用程序的职责。
另请参阅Executor和CameraXExecutors
。
有关所有API更改,另请参见release notes或commits ...,这违反了CameraXBasic示例。我不会再解释这些API差异了(因为这不是问题),而是have forked;请参见issues #131(到目前为止,至少在那里可以进行预览)。
这实际上是这样的:
val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)
从1.0f
到8.0f
的缩放比例在我的Motorola XT1900上起作用:
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
答案 1 :(得分:0)
这是Android的传统,缩放级别与许多其他值一样,位于 0
和 1
之间。
0
表示最低的缩放级别。
1
表示最大缩放级别。
这是一个浮点值,因此您可以像0.1
,0.2
,0.9
等那样增加它。
答案 2 :(得分: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 Camera preview zoom using double finger touch