如何解决我在CameraX上使用PreviewView有一个问题?
即使我将AspectRatio
从AspectRatio.RATIO_16_9
更改为AspectRatio.RATIO_4_3
,PreviewView也会缩小到屏幕的一半!
@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
previewView = view.findViewById(R.id.preview_view);
setCameraProviderListener();
}
private void setCameraProviderListener() {
ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
ProcessCameraProvider.getInstance(requireContext());
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future
// This should never be reached
e.printStackTrace();
}
},ContextCompat.getMainExecutor(requireContext()));
}
private void bindPreview(ProcessCameraProvider cameraProvider) {
previewView.setPreferredImplementationMode(PreviewView.ImplementationMode.SURFACE_VIEW);
Preview preview = new Preview.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3).
setTargetRotation(previewView.getDisplay().getRotation())
.build();
CameraSelector cameraSelector =
new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
preview.setSurfaceProvider(previewView.createSurfaceProvider());
cameraProvider.bindToLifecycle(this,cameraSelector,preview);
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.camera.view.PreviewView
android:id="@+id/preview_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Yellow"
android:layout_gravity="center" />
</LinearLayout>
这是我的代码,我面对这个问题已经两个月了!!
PreviewView
包裹在LinearLayout
中,黄色为background
颜色,但是当相机启动时,它仅显示在PreviewView
和{{1 }}变黑。
解决方法
最后,我发现答案有点棘手
android:hardwareAccelerated="true"
,
下面是我编写的用于测试您描述的问题的代码段,但我无法复制。
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider,unbindAll = false)
previewView.setOnClickListener {
bindPreview(cameraProvider)
}
},ContextCompat.getMainExecutor(requireContext()))
}
private var aspectRatio = AspectRatio.RATIO_4_3
private fun getAndUpdateAspectRatio(): Int {
val currentAspectRation = aspectRatio
aspectRatio = if (aspectRatio == AspectRatio.RATIO_4_3) {
AspectRatio.RATIO_16_9
} else {
AspectRatio.RATIO_4_3
}
return currentAspectRation
}
private fun bindPreview(cameraProvider: ProcessCameraProvider,unbindAll: Boolean = true) {
val preview = Preview.Builder()
.setTargetAspectRatio(getAndUpdateAspectRatio())
.setTargetRotation(previewView.display.rotation)
.build()
previewView.preferredImplementationMode = PreviewView.ImplementationMode.SURFACE_VIEW
preview.setSurfaceProvider(previewView.createSurfaceProvider())
if (unbindAll) {
cameraProvider.unbindAll()
}
cameraProvider.bindToLifecycle(viewLifecycleOwner,CameraSelector.DEFAULT_BACK_CAMERA,preview)
}
此代码位于Fragment
内部,其布局包含用PreviewView
包裹的LinearLayout
。我在Pixel 3 XL和Nokia 1上进行了测试。能否测试一下,看看它在您的设备上是否失败?
此外,代码使用CameraX的最新版本,即camera-camera2版本1.0.0-beta07和camera-view版本1.0.0-alpha14。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。