如何将OpenGL与布局结合使用?

时间:2014-07-05 15:36:21

标签: java android eclipse opengl-es

所以我希望能够在我的Open GL视图上放置按钮和其他小部件,或者我想让我的Open GL和布局分割屏幕的空间。我已经得到了一些答案,比如创建一个布局,然后让它从main连接并将GL Surface设置为布局内的视图,如:

myGL = new MySurface(this); 
FrameLayout frame = (FrameLayout)findViewById(R.id.myframelayout);
frame.addView(myGL, 0);

但是它带有一个NullPointerException,它指向:

frame.addView(myGL, 0);

但是,frame和myGL都是null。这是我过去在onCreate()中放入某些代码时遇到的问题,也是我在个人资料中列出的问题(未答复)。然后我尝试通过xml文件创建OpenGLSurface视图,如下所示:

<com.example.escape.MainActivity.MySurface
android:id="@+id/visualizer"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

这也会产生错误,说:

渲染期间引发的异常:loader(com / android / ide / eclipse / adt / internal / resources / manager / ProjectClassLoader的实例):尝试重复的类名定义:&#34; com / example / escape / MainActivity $ MySurface&#34; Window&gt;中记录了异常详细信息。显示视图&gt;错误日志

如果你想知道:com.example.escape是我的MainActivity.java的路径

我也不想做别人说的话,并在OpenGL中创建一个矩形,它始终垂直于屏幕作为按钮。

这是我的主要代码:

   public class MainActivity extends Activity {

GLSurfaceView myGL;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myGL=new MySurface(this);
    setContentView(R.layout.activity_main);

}... 

我的GL曲面和渲染器代码:

class MySurface extends GLSurfaceView
{

private MyRenderer myRend;

public MySurface(Context context)
{
    super(context);

    myRend=new MyRenderer();
    setEGLContextClientVersion(2);
    setRenderer(myRend);
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
}

Square mSquare;
float [] mViewMatrix=new float[16];
float [] mMVPMatrix=new float[16];
float [] mProjectionMatrix=new float[16];
private float[] mRotationMatrix=new float[16];

class MyRenderer implements GLSurfaceView.Renderer
{
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1f);

        mSquare=new Square();
}

@Override
public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

     Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
     Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

    mSquare.draw(mMVPMatrix);

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    GLES20.glViewport(0, 0, width, height);

    float ratio = (float) width / height;
    Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 2, 10);

}   

}

0 个答案:

没有答案