wie man die Oberflächenansicht transparent macht

82

Hallo, ich möchte meine DrawingSurface-Ansicht transparent machen. Ich habe viele Dinge ausprobiert, aber es funktioniert nicht.

Hier ist mein XML-Code, um meine Oberflächenansicht transparent zu machen

<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
quelle
6
STRG + UMSCHALT + F zum Formatieren von XML
Pratik Butani

Antworten:

212

Versuchen Sie dies im Konstruktor:

SurfaceView sfvTrack = (SurfaceView)findViewById(R.id.sfvTrack);
sfvTrack.setZOrderOnTop(true);    // necessary
SurfaceHolder sfhTrackHolder = sfvTrack.getHolder();
sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);
TantanQi
quelle
9
Wow, ich habe darauf gehämmert, da ich bereits das transparente Pixelformat sowie einen transparenten Hintergrund im XML hinzugefügt habe. Es stellt sich heraus, dass der Aufruf 'setZOrderOnTop (true)' KRITISCH ist. Vielen Dank für die Veröffentlichung, ich hätte das sonst nie versucht.
ProjectJourneyman
42
Dies funktioniert hervorragend, außer dass setZOrderOnTop () bedeutet, dass Sie keine Grafiken über dieser SurfaceView platzieren können, was unglücklich ist. = \
drc
2
Aber es deckt alle anderen Ansichten des Layouts ab. Wenn ich also auf die Oberflächenansicht zeichne, werden alle Bilder / Schaltflächen gemalt. Wie komme ich aus diesem Problem heraus?
Skygeek
Versuchte in meiner Seite. Funktioniert gut mit 4.0 aber 2.3.
Wayne_bai
2
Der "Multi-Surface-Test" in Grafika zeigt drei transparente überlappende SurfaceViews, die mit der View UI-Ebene gemischt sind. github.com/google/grafika/blob/master/src/com/android/grafika/… . FWIW, "versuchen Sie dies im Konstruktor" sollte wahrscheinlich "versuchen Sie dies in onCreate()" lauten , und das Ändern des Pixelformats von RGB565 auf RGB888 ist ebenfalls ziemlich notwendig.
Fadden
8
sfvTrack.setZOrderOnTop(true); 

Platziert die Oberflächenansicht über dem Fenster, dh Sie können keine Elemente über der Oberflächenansicht hinzufügen.

Wenn Sie Ansichten über der Oberflächenansicht hinzufügen möchten; Sie sollten in Betracht ziehen:

setZOrderMediaOverlay(true);

stattdessen. Dadurch wird diese Oberflächenansicht über anderen Oberflächenansichten platziert, jedoch immer noch hinter dem Fenster, sodass Sie weitere sichtbare Ansichten über der Oberflächenansicht hinzufügen können.

Mikael Holmberg
quelle
4

Ist Ihre DrawingSurface und Erweiterung von SurfaceView?

Es gibt keine Möglichkeit, ein SurfaceView dazu zu bringen, das zu tun, was Sie möchten. Die Mechanik der Oberflächenansicht ist so, dass dahinter nichts sichtbar sein kann. (Siehe die Antwort hier http://groups.google.com/group/android-developers/browse_thread/thread/8d88ef9bb22da574 )

Ich habe Ihre Hierarchie mit einer benutzerdefinierten Ansicht getestet, die SurfaceView erweitert, und ich sehe Ihr Problem. Wenn ich zu einer benutzerdefinierten Ansicht wechsle, die einfach die Ansicht erweitert, kann ich Transparenz erhalten.

Slund
quelle
danke slund, du hast recht, aber es muss die Vorschau der Kamera hinter sich lassen und es ist meine Zeichenfläche, also möchte ich auf die Vorschau der Kamera zurückgreifen
Sunil Pandey
4

TexttureViewwird besser für Ihre Bedürfnisse sein als SurfaceView, glaube ich.

VJ Vélan Solutions
quelle
1
Ja, vorausgesetzt, wir müssen nicht früher als 14 zielen!
Casey Murray