jak sprawić, by widok powierzchni był przezroczysty


83

Witam, chcę, aby mój widok DrawingSurface był przezroczysty. próbowałem wielu rzeczy, ale to nie działa.

Oto mój kod xml, aby mój widok powierzchni był przezroczysty

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

Odpowiedzi:


214

Spróbuj tego w konstruktorze:

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

9
Wow, wbijałem się w to, dodając już przezroczysty format pikseli, a także przezroczyste tło w XML. Okazuje się, że wywołanie setZOrderOnTop (true) jest KRYTYCZNE. Dzięki za opublikowanie tego, inaczej nigdy bym tego nie próbował.
ProjectJourneyman

43
Działa to świetnie, z wyjątkiem setZOrderOnTop () oznacza, że ​​nie można umieścić żadnej grafiki na wierzchu tego SurfaceView, co jest niefortunne. = \
drc

2
Ale obejmuje wszystkie inne widoki układu, co oznacza, że ​​jeśli rysuję na widoku powierzchni, wszelkie obrazy / przyciski zostaną pomalowane. jak mogę wyjść z tego problemu?
skygeek

Próbowałem po mojej stronie. Działa świetnie w 4.0, ale 2.3.
wayne_bai

2
„Test wielopowierzchniowy” w Grafice pokazuje trzy przezroczyste nakładające się widoki SurfaceViews zmieszane z warstwą View UI. github.com/google/grafika/blob/master/src/com/android/grafika/… . FWIW, „spróbuj tego w konstruktorze” powinno prawdopodobnie przeczytać „spróbuj tego w onCreate()”, a zmiana formatu pikseli z RGB565 na RGB888 jest również bardzo konieczna.
fadden

8
sfvTrack.setZOrderOnTop(true); 

spowoduje umieszczenie surfaceView na górze okna, co oznacza, że ​​nie można dodawać elementów na wierzchu surfaceView.

Jeśli chcesz dodać widoki na górze widoku powierzchni; powinieneś rozważyć użycie:

setZOrderMediaOverlay(true);

zamiast. Spowoduje to umieszczenie tego SurfaceView na wierzchu innych surfaceViews, ale nadal za oknem, umożliwiając dodawanie innych widocznych widoków na górze widoku powierzchni.


4

Czy Twój DrawingSurface i rozszerzenie SurfaceView?

Nie ma sposobu, aby SurfaceView robił to, co chcesz. Mechanika widoku powierzchniowego jest taka, że ​​nie może mieć za sobą nic widocznego. (zobacz odpowiedź tutaj http://groups.google.com/group/android-developers/browse_thread/thread/8d88ef9bb22da574 )

Przetestowałem Twoją hierarchię z niestandardowym widokiem rozszerzającym SurfaceView i widzę Twój problem. Jeśli przełączę się na widok niestandardowy, który po prostu rozszerza widok, mogę uzyskać przezroczystość.


dzięki slund, masz rację, ale muszę umieścić podgląd aparatu za sobą i to jest moja powierzchnia do rysowania, więc chcę rysować na podglądzie aparatu
Sunil Pandey

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.