如何使用 Android CameraX API 缩放相机?
How to zoom camera using Android CameraX API?
我尝试使用 CameraX
.
使用以下代码缩放相机
首先我从 CameraX
得到一个 Preview
并尝试使用 Preview
执行缩放,如下所示。
var config = CameraX.getDefaultUseCaseConfig(PreviewConfig::class.java, lensFacing)
var preview = Preview(config)
preview.zoom(zoom)
在 preview.zoom()
之后,我再次与 CameraX
绑定并出现一些错误并且无法正常工作。
CameraX.bindToLifecycle(this, preview, imageCapture, videoCapture)
当上面的代码不起作用时,我先尝试使用 CameraX.unbindAll()
,然后调用 CameraX.bindToLifecycle()
。但是再次遇到一些错误,并没有获得成功。
告诉我如何使用 CameraX
API.
缩放相机
Update error log below:
错误日志仅使用CameraX.bindToLifecycle()
:
java.lang.IllegalArgumentException: Exceeded max simultaneously bound image capture use cases.
at androidx.camera.camera2.impl.UseCaseSurfaceOccupancyManager.checkUseCaseLimitNotExceeded(UseCaseSurfaceOccupancyManager.java:61)
at androidx.camera.camera2.impl.Camera2DeviceSurfaceManager.getSuggestedResolutions(Camera2DeviceSurfaceManager.java:146)
at androidx.camera.core.CameraX.calculateSuggestedResolutions(CameraX.java:449)
at androidx.camera.core.CameraX.bindToLifecycle(CameraX.java:144)
at com.android.example.cameraxbasic.fragments.CameraFragment$updateCameraUi.onTouch(CameraFragment.kt:408)
at android.view.View.dispatchTouchEvent(View.java:12512)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:475)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1836)
at android.app.Activity.dispatchTouchEvent(Activity.java:3404)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:433)
at android.view.View.dispatchPointerEvent(View.java:12755)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5150)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4953)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4523)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4489)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4629)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4497)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4686)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4523)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4489)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4497)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7192)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7126)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7087)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7295)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:184)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7266)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7318)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:690)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6912)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
使用CameraX.unbindAll()
和CameraX.bindToLifecycle()
的错误日志:
E/Legacy-CameraDevice-JNI: getNativeWindow: Surface had no valid native window.
E/Legacy-CameraDevice-JNI: LegacyCameraDevice_nativeDetectSurfaceDimens: Could not retrieve native window from surface.
--------- beginning of crash
2019-05-09 16:49:29.155 31123-31144/com.android.example.cameraxbasic E/AndroidRuntime: FATAL EXCEPTION: CameraX-
Process: com.android.example.cameraxbasic, PID: 31123
java.lang.IllegalArgumentException: Surface was abandoned
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:84)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:260)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:145)
at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:518)
at androidx.camera.camera2.impl.CaptureSession.open(CaptureSession.java:196)
at androidx.camera.camera2.impl.Camera.openCaptureSession(Camera.java:535)
at androidx.camera.camera2.impl.Camera$StateCallback.onOpened(Camera.java:743)
at androidx.camera.core.CameraDeviceStateCallbacks$ComboDeviceStateCallback.onOpened(CameraDeviceStateCallbacks.java:99)
at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:152)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:73)
at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:606)
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:82)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:260)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:145)
at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:518)
at androidx.camera.camera2.impl.CaptureSession.open(CaptureSession.java:196)
at androidx.camera.camera2.impl.Camera.openCaptureSession(Camera.java:535)
at androidx.camera.camera2.impl.Camera$StateCallback.onOpened(Camera.java:743)
at androidx.camera.core.CameraDeviceStateCallbacks$ComboDeviceStateCallback.onOpened(CameraDeviceStateCallbacks.java:99)
at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:152)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
--------- beginning of system
看来错误与预览缩放无关:
java.lang.IllegalArgumentException: Exceeded max simultaneously bound image capture use cases.
这表明您在解除绑定之前多次调用 CameraX.bindToLifecycle(imageCapture)
,这就是导致崩溃的原因。我还建议使用配置构建器而不是 getDefaultUseCaseConfig
,因为它们更明确且更易于阅读,并且 getDefaultUseCaseConfig
是隐藏的 API.
详情请参考official sample for an example implementation and the documentation
要使缩放正常工作,您还需要在bindToLifecycle() 之后调用zoom() 。
另请注意, zoom() 接受位于传感器坐标中的 Rect 。有关详细信息,请参阅 here。
您可能还需要使用 camera2 API 来获取 sensor active array 并获取相机 ID(请使用第一个具有正确 LENS_FACING 的相机 ID)。
我们知道这些工作量很大,因此我们正在开发一种新的更高级别的缩放 API,它更容易使用。
我可以使用此代码进行缩放 in/out
val my = Rect(left, top, right, bottom)
preview.zoom(my)
请参阅 github and just check my
上的完整示例
它非常适合我。
最后,我们在 CameraX 中获得了缩放 API。请检查以下两种可用于缩放相机预览的方式。
Pinch to zoom:
val scaleGestureDetector = ScaleGestureDetector(context, listener)
cameraTextureView.setOnTouchListener { _, event ->
scaleGestureDetector.onTouchEvent(event)
return@setOnTouchListener true
}
val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val scale = cameraInfo.zoomRatio.value * detector.scaleFactor
cameraControl.setZoomRatio(scale)
return true
}
}
Slide to zoom(using seekbar):
zoomSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
cameraControl.setLinearZoom(progress / 100.toFloat())
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
使用下面得到cameraControl
:
val cameraControl = CameraX.getCameraControl(lensFacing)
Code reference link:
https://github.com/Pinkal7600/camera-samples/tree/master/CameraXBasic
这是我在最新的 CameraX 1.0.0-beta01 示例项目上所做的。添加到 onViewCreated
的底部
val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val scale = camera!!.cameraInfo.zoomState.value!!.zoomRatio * detector.scaleFactor
camera!!.cameraControl.setZoomRatio(scale)
return true
}
}
val scaleGestureDetector = ScaleGestureDetector(context, listener)
viewFinder.setOnTouchListener { _, event ->
scaleGestureDetector.onTouchEvent(event)
return@setOnTouchListener true
}
我尝试使用 CameraX
.
首先我从 CameraX
得到一个 Preview
并尝试使用 Preview
执行缩放,如下所示。
var config = CameraX.getDefaultUseCaseConfig(PreviewConfig::class.java, lensFacing)
var preview = Preview(config)
preview.zoom(zoom)
在 preview.zoom()
之后,我再次与 CameraX
绑定并出现一些错误并且无法正常工作。
CameraX.bindToLifecycle(this, preview, imageCapture, videoCapture)
当上面的代码不起作用时,我先尝试使用 CameraX.unbindAll()
,然后调用 CameraX.bindToLifecycle()
。但是再次遇到一些错误,并没有获得成功。
告诉我如何使用 CameraX
API.
Update error log below:
错误日志仅使用CameraX.bindToLifecycle()
:
java.lang.IllegalArgumentException: Exceeded max simultaneously bound image capture use cases.
at androidx.camera.camera2.impl.UseCaseSurfaceOccupancyManager.checkUseCaseLimitNotExceeded(UseCaseSurfaceOccupancyManager.java:61)
at androidx.camera.camera2.impl.Camera2DeviceSurfaceManager.getSuggestedResolutions(Camera2DeviceSurfaceManager.java:146)
at androidx.camera.core.CameraX.calculateSuggestedResolutions(CameraX.java:449)
at androidx.camera.core.CameraX.bindToLifecycle(CameraX.java:144)
at com.android.example.cameraxbasic.fragments.CameraFragment$updateCameraUi.onTouch(CameraFragment.kt:408)
at android.view.View.dispatchTouchEvent(View.java:12512)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:475)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1836)
at android.app.Activity.dispatchTouchEvent(Activity.java:3404)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:433)
at android.view.View.dispatchPointerEvent(View.java:12755)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5150)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4953)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4523)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4489)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4629)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4497)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4686)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4523)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4489)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4497)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4470)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7192)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7126)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7087)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7295)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:184)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7266)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7318)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:690)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6912)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
使用CameraX.unbindAll()
和CameraX.bindToLifecycle()
的错误日志:
E/Legacy-CameraDevice-JNI: getNativeWindow: Surface had no valid native window.
E/Legacy-CameraDevice-JNI: LegacyCameraDevice_nativeDetectSurfaceDimens: Could not retrieve native window from surface.
--------- beginning of crash
2019-05-09 16:49:29.155 31123-31144/com.android.example.cameraxbasic E/AndroidRuntime: FATAL EXCEPTION: CameraX-
Process: com.android.example.cameraxbasic, PID: 31123
java.lang.IllegalArgumentException: Surface was abandoned
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:84)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:260)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:145)
at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:518)
at androidx.camera.camera2.impl.CaptureSession.open(CaptureSession.java:196)
at androidx.camera.camera2.impl.Camera.openCaptureSession(Camera.java:535)
at androidx.camera.camera2.impl.Camera$StateCallback.onOpened(Camera.java:743)
at androidx.camera.core.CameraDeviceStateCallbacks$ComboDeviceStateCallback.onOpened(CameraDeviceStateCallbacks.java:99)
at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:152)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:73)
at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:606)
at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:82)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:260)
at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:145)
at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:518)
at androidx.camera.camera2.impl.CaptureSession.open(CaptureSession.java:196)
at androidx.camera.camera2.impl.Camera.openCaptureSession(Camera.java:535)
at androidx.camera.camera2.impl.Camera$StateCallback.onOpened(Camera.java:743)
at androidx.camera.core.CameraDeviceStateCallbacks$ComboDeviceStateCallback.onOpened(CameraDeviceStateCallbacks.java:99)
at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:152)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
--------- beginning of system
看来错误与预览缩放无关:
java.lang.IllegalArgumentException: Exceeded max simultaneously bound image capture use cases.
这表明您在解除绑定之前多次调用 CameraX.bindToLifecycle(imageCapture)
,这就是导致崩溃的原因。我还建议使用配置构建器而不是 getDefaultUseCaseConfig
,因为它们更明确且更易于阅读,并且 getDefaultUseCaseConfig
是隐藏的 API.
详情请参考official sample for an example implementation and the documentation
要使缩放正常工作,您还需要在bindToLifecycle() 之后调用zoom() 。 另请注意, zoom() 接受位于传感器坐标中的 Rect 。有关详细信息,请参阅 here。
您可能还需要使用 camera2 API 来获取 sensor active array 并获取相机 ID(请使用第一个具有正确 LENS_FACING 的相机 ID)。 我们知道这些工作量很大,因此我们正在开发一种新的更高级别的缩放 API,它更容易使用。
我可以使用此代码进行缩放 in/out
val my = Rect(left, top, right, bottom)
preview.zoom(my)
请参阅 github and just check my
它非常适合我。
最后,我们在 CameraX 中获得了缩放 API。请检查以下两种可用于缩放相机预览的方式。
Pinch to zoom:
val scaleGestureDetector = ScaleGestureDetector(context, listener)
cameraTextureView.setOnTouchListener { _, event ->
scaleGestureDetector.onTouchEvent(event)
return@setOnTouchListener true
}
val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val scale = cameraInfo.zoomRatio.value * detector.scaleFactor
cameraControl.setZoomRatio(scale)
return true
}
}
Slide to zoom(using seekbar):
zoomSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
cameraControl.setLinearZoom(progress / 100.toFloat())
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
使用下面得到cameraControl
:
val cameraControl = CameraX.getCameraControl(lensFacing)
Code reference link: https://github.com/Pinkal7600/camera-samples/tree/master/CameraXBasic
这是我在最新的 CameraX 1.0.0-beta01 示例项目上所做的。添加到 onViewCreated
的底部val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val scale = camera!!.cameraInfo.zoomState.value!!.zoomRatio * detector.scaleFactor
camera!!.cameraControl.setZoomRatio(scale)
return true
}
}
val scaleGestureDetector = ScaleGestureDetector(context, listener)
viewFinder.setOnTouchListener { _, event ->
scaleGestureDetector.onTouchEvent(event)
return@setOnTouchListener true
}