как сделать вид поверхности прозрачным

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>
Сунил Панди
источник

Ответы:

214

Попробуйте это в конструкторе:

SurfaceView sfvTrack = (SurfaceView)findViewById(R.id.sfvTrack);
sfvTrack.setZOrderOnTop(true);    // necessary
SurfaceHolder sfhTrackHolder = sfvTrack.getHolder();
sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);
TantanQi
источник
9
Ух ты, я забивал на это, уже добавив прозрачный формат пикселей, а также прозрачный фон в XML. Оказывается, вызов setZOrderOnTop (true) КРИТИЧНЫЙ. Спасибо, что разместили это, иначе я бы никогда не попробовал.
ProjectJourneyman
43
Это прекрасно работает, за исключением того, что setZOrderOnTop () означает, что вы не можете размещать какую-либо графику поверх этого SurfaceView, что прискорбно. = \
drc
2
Но он охватывает все другие виды на макете, а это означает, что если я рисую на виде поверхности, то любое изображение / кнопки будут нарисованы. как я могу решить эту проблему?
skygeek
Пробовал на моей стороне. Отлично работает на 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 также весьма необходимо.
fadden
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, и вижу вашу проблему. Если я переключусь на настраиваемое представление, которое просто расширяет представление, я могу получить прозрачность.

шлепать
источник
спасибо slund, вы правы, но нужно поместить предварительный просмотр камеры позади, и это моя поверхность для рисования, поэтому я хочу рисовать предварительный просмотр камеры
Сунил Пандей
4

TexttureViewбудет лучше для ваших нужд, чем SurfaceViewя считаю.

VJ Vélan Solutions
источник
1
Да, при условии, что нам не нужно настраивать таргетинг раньше 14!
Кейси Мюррей