如何使Surfaceview透明


83

您好,我想使我的DrawingSurface视图透明。我尝试了很多事情,但是没有用。

这是我的XML代码,使我的表面视图透明

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:src="@drawable/icon" >
        </ImageView>

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#00000000" >

            <codewalla.android.drawings.DrawingSurface
                android:id="@+id/drawingSurface"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >
            </codewalla.android.drawings.DrawingSurface>
        </LinearLayout>
    </FrameLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/colorRedBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="R" />

        <Button
            android:id="@+id/colorBlueBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="G" />

        <Button
            android:id="@+id/colorGreenBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="B" />

        <Button
            android:id="@+id/undoBtn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="U" />

        <Button
            android:id="@+id/redoBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:onClick="onClick"
            android:text="R" />
    </LinearLayout>

</RelativeLayout>

Answers:


212

在构造函数中尝试以下操作:

SurfaceView sfvTrack = (SurfaceView)findViewById(R.id.sfvTrack);
sfvTrack.setZOrderOnTop(true);    // necessary
SurfaceHolder sfhTrackHolder = sfvTrack.getHolder();
sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);

9
哇,我正在为此努力,已经在XML中添加了透明像素格式和透明背景。事实证明,“ setZOrderOnTop(true)”调用是至关重要的。感谢您发布此信息,否则我将再也没有尝试过。
ProjectJourneyman 2011年

42
除了setZOrderOnTop()意味着您不能在此SurfaceView上放置任何图形之外,这非常有用。= \
drc 2012年

2
但这涵盖了布局上的所有其他视图,这意味着如果我在表面视图上进行绘制,则将绘制任何图像/按钮。我如何摆脱这个问题?
2013年

在我身旁试过。在4.0到2.3上都很好用。
wayne_bai

2
Grafika中的“多表面测试”演示了三个透明的重叠SurfaceView和View UI层的混合。github.com/google/grafika/blob/master/src/com/android/grafika/…。FWIW,“在构造函数中尝试”可能应该读为“在onCreate()”中尝试,并且将像素格式从RGB565更改为RGB888也是很有必要的。
2015年

8
sfvTrack.setZOrderOnTop(true); 

会将surfaceView放置在窗口顶部,这意味着您不能在surfaceView顶部添加项目。

如果要在表面视图的顶部添加视图;您应该考虑使用:

setZOrderMediaOverlay(true);

代替。这会将这个surfaceView放置在其他surfaceView的顶部,但仍在窗口的后面,允许您在该表面视图的顶部添加其他可见视图。


4

您的DrawingSurface和SurfaceView的扩展吗?

没有办法让SurfaceView来执行您想要的操作。表面视图的机制如此复杂,以至于在其后面看不到任何东西。(在此处查看答案http://groups.google.com/group/android-developers/browse_thread/thread/8d88ef9bb22da574

我用扩展SurfaceView的自定义视图测试了您的层次结构,然后看到了您的问题。如果切换到仅扩展View的自定义视图,则可以获得透明度。


谢谢斯隆德,您是对的,但是它需要在后面放上相机预览并将其作为我的绘图表面,所以我想在相机预览上进行绘图
Sunil Pandey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.