2010-11-08 9 views
9

Wie richte ich ein XML-Layout ein, in dem eine OpenGL-Ansicht enthalten ist? Wie ich jetzt mache, ist die OpenGL-Ansicht als einzige Ansicht mit setContentView() eingestellt. Aber ich möchte ein XML-Layout erstellen, das die OpenGL-Ansicht enthält. Nehmen wir an, ich möchte die OpenGL-Ansicht hauptsächlich und eine kleine TextView am unteren Rand haben.OpenGL-Ansicht in einem Layout

Ist das überhaupt möglich? Oder kann eine OpenGL-Ansicht nur die einzige Ansicht sein?

Antwort

7

Sie könnten sich SurfaceView ansehen. Es bietet eine dedizierte Zeichenfläche, die in einer Ansichtshierarchie eingebettet ist. Siehe auch drawing with canvas.

+0

Danke! Auf SurfaceView jetzt lesen. Es fühlt sich an, als ob ich danach suche, aber ich kann nicht herausfinden, wie ich es tatsächlich mache. Ich kann SurfaceView in der Layout-XML-Datei einrichten. Und ich kann setContentView() setzen, um dieses XML-Layout zu verwenden. Aber ich kann nicht sehen, wie ich meine GLSurfaceView-Klasse dazu bringen kann, in die SurfaceView der XML-Layoutdatei zu zeichnen. – Espen

+1

Oh, GLSurfaceView ist ein SurfaceView, also können Sie es einfach in Ihrem Layout verwenden, wo Sie SurfaceView verwenden. –

3

Erstellen Sie ein LinearLayout in Ihrer XML-Datei. Dann in der Tätigkeit, verwenden findViewById(), um das Layout zu erhalten und verwenden addView(), um die OpenGL Surface in Ihrem Layout hinzuzufügen:

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

Dies ist, was ich für meine Teilchenstrahler tat: eine GLSurfaceView verlängern und machen Es ist Teil meines Layouts. Hinweis: Umsetzung der "ParticleRenderer" Klasse zu erreichen, was openGL Zeug Sie

My Custom Ansicht zu tun:

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

} 

und im Layout ...

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

Der Partikel-Render ist einfach ... für einige Beispielcode, siehe: 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 
    } 
} 
Verwandte Themen