Android 每次在CameraX库中创建预览后,是否需要bindToLifecycle()来打开/关闭/自动闪烁
据我从许多实施中了解,例如: 在CameraX实现中的每个用例之后,都需要调用cameraProvide.bindToLifecycle()方法 例如,如果我需要从默认关闭模式打开相机的闪光灯模式,那么需要再次调用bindToLifecycle()方法 这种方法的缺点是,在一两秒钟内,预览会被删除并重新连接,这让应用程序感觉不到平滑过渡 是否有更好的做法或限制? 我在下面附上了一个示例代码:Android 每次在CameraX库中创建预览后,是否需要bindToLifecycle()来打开/关闭/自动闪烁,android,android-camerax,Android,Android Camerax,据我从许多实施中了解,例如: 在CameraX实现中的每个用例之后,都需要调用cameraProvide.bindToLifecycle()方法 例如,如果我需要从默认关闭模式打开相机的闪光灯模式,那么需要再次调用bindToLifecycle()方法 这种方法的缺点是,在一两秒钟内,预览会被删除并重新连接,这让应用程序感觉不到平滑过渡 是否有更好的做法或限制? 我在下面附上了一个示例代码: private void bindCameraUseCase() { int scre
private void bindCameraUseCase() {
int screenAspectRatio = getAspectRatio(previewView.getWidth(), previewView.getHeight());
int rotation = previewView.getDisplay().getRotation();
preview = new Preview.Builder()
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.build();
cameraSelector = new CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build();
imageCapture = new ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build();
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll();
preview.setSurfaceProvider(previewView.createSurfaceProvider());
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
}
和切换手电筒:
private void toggleFlash(){
Log.d(TAG, "toggleFlash: "+flashMode);
switch (flashMode){
case ImageCapture.FLASH_MODE_OFF:
flashMode = ImageCapture.FLASH_MODE_ON;
flashButton.setBackgroundResource(R.drawable.ic_flash_on_24dp);
break;
case ImageCapture.FLASH_MODE_ON:
flashMode = ImageCapture.FLASH_MODE_AUTO;
break;
case ImageCapture.FLASH_MODE_AUTO:
flashMode = ImageCapture.FLASH_MODE_OFF;
break;
}
bindCameraUseCase();
}
我正在使用CameraX版本-1.0.0-beta04在创建
ImageCapture
实例并将其绑定到生命周期后,可以使用
关于绑定ImageCapture
用例之前和之后设置flash模式之间的区别,您的问题是,AFAIK实际上没有太大区别。当您通过调用ImageCapture.takePicture()
拍摄照片时,会使用不同的配置参数生成一个捕获请求,其中一个是flash模式。因此,只要在此调用之前设置了flash模式(ImageCapture.takePicture()
),捕获请求的输出就应该是相同的
CameraX目前在引擎盖下使用Camera2,为了更好地了解拍照时如何设置闪光灯模式,您可以查看。我看到ImageCapture.flashMode仅在使用初始配置ImageCapture.Builder()等构建时有效。 但是,如果要动态启用/禁用闪存,则必须使用以下命令
camera?.cameraControl?.enableTorch(enableFlash)
如果你想知道照相机是什么?从文档中捕获它
// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
如果你想控制火炬,比如打开和关闭火炬,你可以考虑使用。它不需要重新绑定用例,您可以在绑定发生后获得一个
CameraControl
实例。不,我是在构建imageCapture对象时单击图片时查看flash的。如果flash模式被更改,那么我需要再次调用bindToLifecylce(),这将在一两秒钟内删除预览,我觉得这不是平滑过渡?或者有其他方法吗?如果在设置ImageCapture
后需要更改闪光模式,您只需使用,它为后续拍摄的图像定义了闪光模式。这就是你要找的吗?是的,这就是我要找的,而且很好用。非常感谢。一个小的后续问题。ImageCapture用例已绑定到生命周期。在不重新绑定到生命周期的情况下,如何更改用例的功能(例如我的用例的flash模式)?任何需要了解的相关资源都可以!