如何在SurfaceView上方制作一个自定义的透明叠加视图?

5

我已经在stackoverflow和其他网站上看过很多类似的问题,但都没有找到解决方案。我只是想在SurfaceView上叠加一个透明视图,最后在上面绘制一个矩形,使其覆盖相机预览。

我无法让自定义视图变为透明,它会遮挡住底层的相机预览。有什么建议吗?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <FrameLayout 
        android:layout_alignParentTop="true"
        android:layout_width="fill_parent"
        android:layout_height="400dip">
        <SurfaceView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:id="@+id/drawSurface"  />
        <com.bobby.facecapture.FaceOverlayView
            android:id="@+id/drawOverlay"
            android:background="@android:color/transparent" 
            android:layout_width="200dip"     
            android:layout_height="200dip"    
        />
    </FrameLayout>
</RelativeLayout>

这里的200x200只是暂时的,目的是为了证明它确实覆盖在其他视图之上。

FaceOverlayView只是一个自定义视图 - 直接从View派生而来,现在没有重写任何内容。

我在相机预览的顶部得到了一个黑色矩形。


我们在其中一个应用程序中使用了非常类似的设置,它似乎运行良好 - 尝试覆盖自定义视图中的 onDraw 方法并且什么都不做(不要调用 super),这样有改善吗? - Ertebolle
谢谢你的建议,但我仍然只看到一个黑色视图。我尝试在构造函数和XML声明中将背景颜色设置为透明。现在,在派生视图中除了构造函数和空的onDraw之外没有任何东西。 - Bobby
看起来可能有点过头,但是把一张透明的图片设置为背景会不会行呢? - MrZander
同样的结果——我甚至尝试添加一个带有透明png的普通ImageView在上面-但它仍然使一切变黑。 - Bobby
4个回答

2

好的,这个资源文件是条形码扫描器的捕捉布局,它在相机预览的顶部有一个“取景器”层。他们使用自己的@color/transparent资源,定义为<color name="transparent">#00000000</color>。也许可以浏览一下他们的代码,试着找出你和他们的不同之处。


0

我将 alpha 通道设置为 0。它完美地工作。

我是在添加自定义视图运行时之后这样做的。

(ImageView) myCustomView.setAlpha(0)

0

你尝试过将src或background设置为@null吗?

此外,如果这种方法行不通,您可以考虑使用路径来绘制到表面上,这将允许您在运行时动态更改矩形的大小/位置。

然而,这需要编写一些SurfaceView的代码并处理onDraw,这可能对于您正在做的事情来说有点过度。基本上,这意味着使您的自定义类成为SurfaceView的扩展,而不是放置在其上的东西。


嗯,我会尝试使用空值方法 - 我已经尝试重新设计使用单个视图从SurfaceView派生的方案 - 将两者合并为一个(在派生的SurfaceView中覆盖onDraw以绘制覆盖层,使用相同的Paint-rectangle技术),但是信不信由您,我得到了相同的结果。 - Bobby

0
我一直在做同样的事情,在相机预览上叠加自定义视图。最初,视图是不透明的,因此相机预览被阻塞了。问题在于我试图将图像绘制到画布上,但指定的图像为RGB_565,将其更改为ARGB_8888就可以正常工作了。您必须具有alpha通道,并确保自定义视图的背景设置为透明。

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