You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:24:44