Android glSurfaceView,使用XML / Java进行叠加

时间:2010-11-08 01:29:41

标签: android button surfaceview glsurfaceview

我启动了一个Android OpenGL应用程序,我有以下类:

class A extends Activity
class B extends GlSurfaceView implements Renderer

当调用类A的onCreate时,它会创建一个类B类的对象并调用:

setContentView(Bobject)

到目前为止它的确有效,我花了几天时间。

现在我想在我的应用程序中添加按钮并找到SurfaceViewOverlay示例。这使用一些XML来创建视图层次结构。我想创建一些非常类似于我简单剪切和粘贴XML代码的东西:

    <android.opengl.GLSurfaceView android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    <LinearLayout android:id="@+id/hidecontainer"
            android:orientation="vertical"
            android:visibility="gone"
            android:background="@drawable/translucent_background"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            ...

现在请记住我原来的类层次结构,如何初始化我的视图?我应该在A班的onCreate()中写什么?

我尝试使用:

Bobject = new B(this);
GLSurfaceView glSurfaceView =
        (GLSurfaceView) findViewById(R.id.glsurfaceview);
    glSurfaceView.setRenderer(Bobject);

它确实在屏幕上绘制按钮和GL视图,但GL视图无法从点击/点击中获取任何输入。

这可能是因为Bobject的onTouchEvent()没有被调用,因为它只被用作:

Renderer

而不是a:

glSurfaceView

对象。

而不是上面的代码,我真正想要的是让Bobject替换glSurfaceView。但我不知道该怎么做。当我找到FindById()时,似乎已经创建了glSurfaceView。如何让它在GL视图中使用B类对象?

对于任何新手错误感到抱歉。完全是Android新手。

编辑:我也试过这个:

我还尝试了以下方法: 在我的XML文件中,我将GLSurfaceView更改为:

<com.bla.bla.B
            android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

在我的A类构造函数中,我正在调用:

// This returns null
Bobject = (B) findViewById(R.id.glsurfaceview);

// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay);

我应该如何使用我的XML文件/ Activity中扩展glSurfaceView的自定义类?

2 个答案:

答案 0 :(得分:7)

好的,所以这样做的正确方法是在B类中有一个构造函数,它接受:

B(Context context, AttributeSet attrs)
{
  super(context, attrs);
}

在XML布局中,使用:

<com.bla.bla.B
        android:id="@+id/glsurfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

我的代码中缺少的是构造函数签名。

答案 1 :(得分:1)

解决此问题的另一种方法是将视图保留在Activity A上。因此,使用setContentView(A对象)而不是使用setContentView(A对象),而在“A XML”文件中,使用GLsurfaceView视图:

<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

然后你可以在活动A中引用你的B对象,因为当你将setContentView设置为A而不是B时它被夸大了:

GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.glsurfaceview);


glSurfaceView.setRenderer();  //no longer have to pass the object

老实说,我不确定如何让它按照你想要的方式工作,但在你的情况下,我不确定它最终会有所作为。再说一次,我还是个新手。我有兴趣学习如何以另一种方式做到这一点,就像我今天提出的类似问题一样。