基于Android Camera2Basic API在相机预览层添加十字准星(图片)
给Camera2Basic相机应用添加十字准星的解决方案
嘿,这事儿其实挺简单的,咱们一步步来搞定:
1. 准备资源文件
先把你的水平线十字准星.png图片(记得用透明背景!不然会挡住预览内容)放到项目的res/drawable文件夹下,如果有不同分辨率的适配版本,对应放到drawable-hdpi、drawable-xhdpi等目录里,能让图片在不同设备上显示更清晰。
2. 修改布局XML
Camera2Basic示例用的是RelativeLayout,咱们只需要在预览视图的上层叠加一个ImageView来展示十字准星就好。把你原来的布局代码修改成下面这样:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 原有的相机预览TextureView,保持原有设置不变 --> <TextureView android:id="@+id/texture" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 新增的十字准星ImageView,居中显示在预览之上 --> <ImageView android:id="@+id/crosshair" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@drawable/your_crosshair_image" <!-- 这里替换成你实际的图片文件名 --> android:adjustViewBounds="true" android:alpha="0.8" /> <!-- 可选:调整透明度,避免完全挡住预览内容 --> <!-- 原有的拍照按钮,保持原有设置不变 --> <Button android:id="@+id/capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" android:text="Capture" /> </RelativeLayout>
3. 可选:动态调整逻辑(如果需要)
如果你的需求里需要动态显示/隐藏十字准星,或者根据预览比例调整尺寸,那可以在Camera2BasicFragment(或者对应的Activity)里添加简单逻辑:
Kotlin 版本
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 获取十字准星控件 val crosshair = view.findViewById<ImageView>(R.id.crosshair) // 示例:需要时隐藏十字准星 // crosshair.visibility = View.GONE // 示例:根据预览尺寸调整十字准星大小 // textureView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> // val previewSize = textureView.width.coerceAtMost(textureView.height) // crosshair.layoutParams = RelativeLayout.LayoutParams(previewSize / 5, previewSize / 5) // } }
Java 版本
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 获取十字准星控件 ImageView crosshair = view.findViewById(R.id.crosshair); // 示例:需要时隐藏十字准星 // crosshair.setVisibility(View.GONE); // 示例:根据预览尺寸调整十字准星大小 // textureView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { // int previewSize = Math.min(textureView.getWidth(), textureView.getHeight()); // RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(previewSize / 5, previewSize / 5); // params.addRule(RelativeLayout.CENTER_IN_PARENT); // crosshair.setLayoutParams(params); // }); }
注意事项
- 确保你的十字准星图片是透明背景,否则会遮挡相机预览内容;
- 如果图片显示有拉伸变形,检查
android:adjustViewBounds="true"是否添加,或者给ImageView设置固定的宽高; - 因为RelativeLayout中后添加的控件层级更高,所以把ImageView放在TextureView之后就能保证它在预览层上方显示。
内容的提问来源于stack exchange,提问作者Ashish Manatosh Barik
相关产品推荐
相关产品推荐

