Android:想在相机预览上添加轮廓叠加

4
我想知道如何在相机预览的顶部放置一个轮廓。目前我已经成功地实现了以下示例,该示例只是预览相机。 http://developer.android.com/reference/android/view/TextureView.html 我正在尝试创建一个相机预览,其中显示轮廓,以便使用该应用程序的人可以了解应该拍摄图片的位置,然后有一个按钮,当单击时,拍照,当然不会在图片中出现轮廓。
这怎么做?我似乎找不到任何关于如何在纹理视图上放置叠加层的示例。

2
一个 TextureView 的行为就像一个普通的 View,所以你可以像把任何 View 放在另一个 View 上一样来使用它。 - Mike M.
@MikeM。假设我也不知道怎么做:D - Mikkel Larsen
这里已经有许多示例,但是一个可能的选项的简要描述:创建一个具有FrameLayout作为根视图的布局XML文件。将TextureView列为FrameLayout的第一个子元素,将其layout_widthlayout_height设置为match_parent。将一个具有相同尺寸的ImageView列为第二个子元素,使其background透明 - #00000000 - 并将其src设置为您的剪影图像,该图像也应具有透明背景。然后在setContentView()调用中加载您的布局文件,而不仅仅是TextureView - Mike M.
@MikeM。我真的无法让任何示例正常工作 :/ - Mikkel Larsen
@MikeM。那就太完美了! - Mikkel Larsen
显示剩余2条评论
1个回答

10

通过你提供的链接,使用 TextureView 文档中的示例,我们可以创建一个布局 XML 文件来容纳我们的 TextureView 和重叠的 ImageView 在一个 FrameLayout 中。然后,我们将这个布局文件的资源 ID 传递给 ActivitysetContentView() 方法,而不是在示例中动态创建的 TextureView

布局文件名为main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextureView android:id="@+id/texture_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ImageView android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00000000"
        android:src="@drawable/ic_launcher" />

</FrameLayout>

以及示例Activity:

public class LiveCameraActivity extends Activity
    implements TextureView.SurfaceTextureListener {

    private Camera mCamera;
    private TextureView mTextureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTextureView = (TextureView) findViewById(R.id.texture_view);
        mTextureView.setSurfaceTextureListener(this);
    }

    // The TextureView.SurfaceTextureListener methods
    // are the same as shown in the example.

    ...
}

布局中的覆盖ImageView使用默认的启动器图标作为其源图像,因为在我的IDE上它具有透明度。稍后您将用您的轮廓替换此图像。由于View是按照它们在布局中列出的顺序绘制的,第一个列出的View位于底部,即在Z轴上离您最远,所以ImageViewTextureView之后列出,将显示在其上面。

Activity中,我们只需将布局作为内容View加载,并获取在那里创建的TextureView的引用。其余部分都相同。


1
真是太神奇了!我已经尝试了几个小时让它工作,感觉自己已经按照你刚才写的做了好几次。但这次终于成功了!非常感谢你!祝你有美好的一天! - Mikkel Larsen
相机现在占据整个屏幕。你知道如何使它变小吗?我尝试添加以下内容: Camera.Parameters parameters = camera.GetParameters(); parameters.SetPictureSize(width, height); camera.SetParameters(parameters);但这似乎并没有解决问题。它始终保持相同的大小。 - Mikkel Larsen
是的,您需要调整TextureView的大小,实际上是更改其父级FrameLayout的大小。您可以将我的示例布局视为一种单个View,并将其放置在您想要的任何其他布局中,就像在向Activity的布局添加ButtonEditText时一样。这样说通了吗? - Mike M.
好的。再次抱歉打扰您,但我对Android不是很熟悉。假设我想要一个黑色框架,在其中我想要一个TextureView(相机预览图像),但它必须比框架略小,以便我可以在Textureview周围看到它。在黑色框架的底部,我想要一个按钮来捕获图像。如果您有时间,可以告诉我这会是什么样子吗? :) - Mikkel Larsen
好的,在这里。我还保留着那个布局的编辑器,所以调整很快。如果你访问有问题,请告诉我。我不经常使用Drive。 - Mike M.
太棒了,我明天会检查这个! :D - Mikkel Larsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接