GLSurfaceView mit transparentem hintergrund

  • Antworten:2
Harry
  • Forum-Beiträge: 52

09.05.2011, 11:19:27 via Website

Ich schätze, ich habe das Problem zu kompliziert dargestellt.

Hier ein erneuter Versuch:
Ich möchte eine GLSurfaceView mit OpenGL objecten in ein ganz normales Android Layout eingliedern.
Hierbei sollen einige Views vor und einige hinter meinen OpenGL-Objecten sein.
Dies kann beeinflusst werden, in einem stink normalen XML-Layout.
Mein Problem ist jedoch, dass ich den Hintergrund der GLSurfaceView nur transparent bekomme, wenn ich die Eigenschaft setZorderOnTop(true) setze.
Wodurch die GLSurfaceView jedoch vor alle Views gesetzt wird.

Hat jemand eine Idee, wie man dieses Problem lösen könnte? Ich beiße mir hieran wirklich alle Zähne aus. Über jeglichen Tipp bin ich sehr dankbar!

Gruß Harry


Hallo,
ich versuche gerade eine View (RelativeLayout) vor meine GLSurfaceView zu bringen.

Meine Ausgangssituation ist folgende:

In der Activity-Klasse setze ich als ContentView ein XML-Layout. Hierdrin setzte ich verschiedene Buttons und TextViews mit verschiedenen Layouts.
Zudem setzte ich in meinem XML-Layout auch eine GLSurfaceView.
Die GLSurfaceView ist transparent und setZOrderOnTop ist True.

Somit Zeichne ich also meien "Standard-Views" (Buttons, TextViews, etc.) hinter die transparente GLSurfaceView.
Soweit klappt auch alles.

Nun möchte ich aber bei einem Klick auf einen Button eine View (eine gefärbte Fläche) von oben in einer TranslateAnimation hereinfahren lassen.
Dies funktioniert auch, jedoch sind die Objekte die ich in meiner GLSurfaceView zeichne, vor meiner Animation.

Die Eigenschaft SetZOrderOnTop der GLSurfaceView auf "False" zu setzten hat keinen effekt.

Über jeglichen Tipp bin ich dankbar!

Gruß Harry

Nachtrag zur Verdeutlichung:

1glSurfaceView.setZOrderOnTop(true);
Muss ich am Anfang setzten, da ich zu diesem Zeitpunkt die GLSurfaceView tatsächlich im Vordergrund haben will.
Wenn ich dies jedoch nicht tue, fährt die View in der Anmation wie gewünscht vor die GLSurfaceView.
Daher suche ich eine Möglichkeit, die GLSurfaceView on Runtime auf setZOrderOnTop(true) zu setzen, was die Methode jeodch laut Doku nicht unterstützt.


Control whether the surface view's surface is placed on top of its window. Normally it is placed behind the window, to allow it to (for the most part) appear to composite with the views in the hierarchy. By setting this, you cause it to be placed above the window. This means that none of the contents of the window this SurfaceView is in will be visible on top of its surface.

Note that this must be set before the surface view's containing window is attached to the window manager.

Calling this overrides any previous call to setZOrderMediaOverlay(boolean).

— geändert am 12.05.2011, 16:00:30

Antworten
Harry
  • Forum-Beiträge: 52

12.05.2011, 16:07:43 via Website

Hat irgendwer Erfahrung in dieser Richtung?

Antworten
Gelöschter Account
  • Forum-Beiträge: 5

15.07.2012, 22:46:50 via Website

Schau mal hier, hat mir heute den letzten Nerv geraubt ...

http://stackoverflow.com/questions/2498494/android-transparent-sub-glsurfaceview-in-layout

------------------

I use my own GLSurfaceView class to display charts (transparent background / overlay). My extended GLSurfaceView is embed via XML into a popover window.

<com.dsignmatters.iq_fitfunlite.GLPieChartView
android:id="@+id/gameprogress_chart"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
...
As part of the activity I added this code:

mGamesuccessPieChart = (GLSurfaceView) gameprogressView.findViewById(R.id.gameprogress_chart);
mGamesuccessPieChart.setZOrderOnTop(true);
Last but not least my GLSurfaceView looks like this:

public class GLPieChartView extends GLSurfaceView {

public GLPieChartView(Context context) {
super(context);
initGL();
}

public GLPieChartView(Context context, AttributeSet attrs) {
super(context, attrs);
initGL();
}

void initGL() {
setEGLContextClientVersion(2);
setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(new GLPieChartRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
}
}

— geändert am 15.07.2012, 22:48:20

Antworten