2015-08-04 2 views
0

J'ai deux GLSurfaceViews dans un FrameLayout, comme suit:Android: pour le dessin de travail sur GLSurfaceViews, SurfaceViews

<FrameLayout 
    android:layout_width = "match_parent" 
    android:layout_height = "match_parent" > 

    <android.opengl.GLSurfaceView 
     android:id = "@+id/glSurfaceView1" 
     android:layout_width = "match_parent" 
     android:layout_height = "match_parent" > 

    <android.opengl.GLSurfaceView 
     android:id = "@+id/glSurfaceView2" 
     android:layout_width = "match_parent" 
     android:layout_height = "match_parent" > 


</FrameLayout> 

Lorsque vous utilisez la mise en page, glSurfaceView2 est dessiné avant glSurfaceView1. Par exemple, tout ce que vous voyez à l'écran est glSurfaceView1. Cette question a été partiellement répondue ici: Android: FrameLayout not respecting draw order

J'ai déjà essayé d'ajouter dynamiquement les GLSurfaceViews à la FrameLayout mais cela ne dessine toujours pas dans le bon ordre. Le remplacement de FrameLayout par RelativeLayout ne fonctionne pas non plus.

Alors, comment puis-je forcer l'ordre de dessin afin que glSurfaceView1 soit dessiné avant glSurfaceView2 (comme il se doit)?

Répondre

0

Vous ne pouvez pas l'appliquer à partir de la mise en page, car les surfaces SurfaceView ne sont pas composées par l'application. Les couches sont transmises au compositeur système, qui voit deux couches tenter d'occuper le même espace en même temps et choisit un gagnant.

Vous pouvez sélectionner un ordre Z pour SurfaceView à partir d'un petit ensemble. Par défaut, la Surface est placée à l'arrière, derrière la couche Vue. Vous pouvez utiliser setZOrderMediaOverlay() pour le placer entre la vue et la surface la plus à l'arrière, ou setZOrderOnTop() pour le mettre devant tout. Ces appels doivent être effectués avant la création de Surface, généralement au onCreate() de la classe d'activité, avant le déclenchement du rappel surfaceCreated().

(Note:. GLSurfaceView est juste un SurfaceView avec un code d'aide pour la configuration EGL et la gestion des threads AFAIK ne pas interférer avec la sélection Z-commande.)

Vous pouvez trouver un exemple avec trois SurfaceViews se chevauchent dans "multi-surface test" de Grafika.