2010-11-08 9 views
9

¿Cómo configuro un diseño xml donde una vista OpenGL es parte de él? Como lo hago ahora, configuro la vista de OpenGL como la única vista con setContentView(). Pero me gustaría crear un diseño xml que incluya la vista de OpenGL. Digamos que quiero tener la vista OpenGL principalmente y una pequeña TextView en la parte inferior.Vista OpenGL dentro de un diseño

¿Esto es posible? ¿O una vista de OpenGL solo puede ser la única vista?

Respuesta

7

Puede consultar SurfaceView. Proporciona una superficie de dibujo dedicada incrustada dentro de una jerarquía de vista. Consulte también drawing with canvas.

+0

Gracias! Lectura en SurfaceView ahora. Se siente como lo que busco, pero no puedo descubrir cómo hacerlo. Puedo configurar SurfaceView en el archivo xml de diseño. Y puedo configurar setContentView() para usar ese diseño xml. Pero no veo cómo hacer que mi clase GLSurfaceView dibuje en SurfaceView del archivo de diseño xml. – Espen

+1

Oh, GLSurfaceView es un SurfaceView, por lo que puedes usarlo en tu diseño donde estés usando SurfaceView. –

3

Cree un LinearLayout dentro de su archivo xml. Luego, en la actividad, utilice findViewById() para obtener el diseño y el uso addView() para añadir el OpenGL SurfaceView en su diseño:

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

Esto es lo que hice para mi emisor de partículas: extender una GLSurfaceView y crea es parte de mi diseño. Nota: implementar la clase "ParticleRenderer" para lograr cualquier cosa OpenGL que quiere hacer

Mi punto de vista personalizada:

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)); 
    } 

} 

y en el diseño ...

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

La partícula Render es directa ... para ver un código de muestra, ver: 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 
    } 
} 
Cuestiones relacionadas