2014-11-14 135 views
1

我試圖運行Android樣品http://developer.android.com/training/graphics/opengl/index.html添加GLSurfaceView佈局

我必須添加一些控件,如文本和按鈕的觀點,這將看起來像android ui

如何在Android的佈局中使用GLSurfaceView?

主要活動(跳過一些自動生成的代碼)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mGLSurfaceView = (myGLSurfaceView) findViewById(R.id.glSurfaceViewID); //crashes 
} 

表面視圖

public class myGLSurfaceView extends GLSurfaceView { 
private myRenderer mRenderer; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
    return super.onTouchEvent(event); 
} 

public myGLSurfaceView (Context context) { 
    super(context); 
    // Create an OpenGL ES 2.0 context. 
    setEGLContextClientVersion(2); 


    // Creating a Renderer 
    setRenderer(new myRenderer(context));  

    // Render the view only when there is a change in the drawing data 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

public myGLSurfaceView (Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

public void setRenderer(myRenderer mRenderer, float density) { 
    // TODO Auto-generated method stub 

} 

} 

佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id= "@+id/linearlayout1" > 

<Button 
    android:id="@+id/buttonID" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" 
    android:text="A Button" /> 

<GLSurfaceView 
    android:id="@+id/glSurfaceViewID" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.23" /> 

回答

2

GLSurfaceView與將其添加到佈局時沒有任何不同。唯一的考慮是它在使用時大部分都是子類,就像它在你的代碼中完成的那樣,而對其他類型的視圖來說這不是很常見(但也不是非常不尋常)。

在你嘗試的問題是將它添加到佈局時使用的類名:

<GLSurfaceView 
    ... 

毫不奇怪,當佈局膨脹,這將創建GLSurfaceView類的一個實例。但那不是你想要的。您想要創建派生類的實例,即myGLSurfaceView。一個明顯的嘗試做到這一點將是:

<myGLSurfaceView 
    ... 

這是不行的。類名稱需要用包名稱限定。說你myGLSurfaceView類是com.msl.myglexample包的一部分:

package com.msl.myglexample; 

public class myGLSurfaceView extends GLSurfaceView { 
    ... 
} 

然後在佈局文件的功能項將是:

<com.msl.myglexample.myGLSurfaceView 
    .... 

這不是在OP的代碼中的問題,但因爲這是人們在嘗試這樣做時遇到的常見問題:衍生GLSurfaceView的構造函數以AttributeSet作爲參數也很重要。這對於所有從XML充值的視圖都是必需的。

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