2010-11-08 1 views
9

Come si configura un layout xml in cui una vista OpenGL fa parte di esso? Come faccio ora è impostare la vista OpenGL come unica vista con setContentView(). Ma vorrei creare un layout xml che includa la vista OpenGL. Diciamo che voglio avere la vista OpenGL principalmente e una piccola TextView in fondo.Visualizzazione OpenGL all'interno di un layout

È possibile? Oppure una vista OpenGL può essere solo la vista unica e unica?

risposta

7

Si potrebbe guardare SurfaceView. Fornisce una superficie di disegno dedicata incorporata all'interno di una gerarchia di viste. Vedi anche drawing with canvas.

+0

Grazie! Leggendo su SurfaceView ora. Sembra quello che sto cercando, ma non riesco a scoprire come farlo davvero. Posso configurare SurfaceView nel file xml di layout. E posso impostare setContentView() per usare quel layout xml. Ma non riesco a vedere come rendere il mio disegno di classe GLSurfaceView su SurfaceView del file di layout xml. – Espen

+1

Oh, GLSurfaceView è-un SurfaceView, quindi puoi semplicemente usarlo nel tuo layout dove stai usando SurfaceView. –

3

Creare un LinearLayout all'interno del file xml. Poi nell'attività, utilizzare findViewById() per ottenere il layout e utilizzare addView() per aggiungere l'OpenGL SurfaceView nel layout:

LinearLayout l = (LinearLayout) findViewById(R.id.MyLinearLayout); 
GLSurfaceView s = new GLSurfaceView(this); 
s.setRenderer(myGLRenderer); 

//to add the view with your own parameters 
l.addView(s, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

//or simply use 
l.addView(s,0); 
8

Questo è quello che ho fatto per il mio emettitore di particelle: estendere una GLSurfaceView e fare fa parte del mio layout. Nota: implementare la classe "ParticleRenderer" per raggiungere qualunque roba openGL che vuoi fare

La mia opinione su misura:

public class OpenGLView extends GLSurfaceView 
{ 

    //programmatic instantiation 
    public OpenGLView(Context context) 
    { 
     this(context, null); 
    } 

    //XML inflation/instantiation 
    public OpenGLView(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public OpenGLView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs); 

     // Tell EGL to use a ES 2.0 Context 
     setEGLContextClientVersion(2); 

     // Set the renderer 
     setRenderer(new ParticleRenderer(context)); 
    } 

} 

e nel layout ...

<com.hello.glworld.particlesystem.OpenGLView 
    android:id="@+id/visualizer" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

La particella Render è diretta ... per alcuni esempi di codice, vedere: https://code.google.com/p/opengles-book-samples/source/browse/trunk/Android/Ch13_ParticleSystem/src/com/openglesbook/particlesystem/ParticleSystemRenderer.java

public class ParticleRenderer implements GLSurfaceView.Renderer 
{ 
    public ParticleRenderer(Context context) 
    { 
     mContext = context; 
    } 

    @Override 
    public void onDrawFrame(GL10 gl) 
    { 
     //DO STUFF 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) 
    { 
     //DO STUFF 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) 
    { 
     //DO STUFF 
    } 
}