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>
Sunil Pandey
źródło

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);
TantanQi
źródło
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.

Mikael Holmberg
źródło
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ść.

slund
źródło
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
4

TexttureViewbędzie lepsze dla twoich potrzeb niż SurfaceView, jak sądzę.

VJ Vélan Solutions
źródło
1
Tak, pod warunkiem, że nie musimy celować wcześniej niż 14!
Casey Murray,