使用XML/Java实现Android glSurfaceView叠加层

6

我开始了一个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。但我不知道该怎么做。当我执行findViewById()时,似乎glSurfaceView已经被创建了。我如何要求它使用类型为B的对象作为GL视图?

对任何新手错误感到抱歉。完全是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的自定义类?

1
我卡在同一个问题上,找不到一个完整的应用程序来演示这个东西。有人能展示一些示例应用程序吗?我似乎无法在Android示例中找到这个著名的SurfaceOverlayView示例。提前致谢。 - rgngl
2个回答

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" />

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

添加相同的东西,我得到了“构造函数Object(Context, AttributeSet)未定义”的错误。你能指导我吗? - Pinser
我已经添加了Renderer类。 - Pinser

1
另一种解决方法是将您的视图附加到Activity A。因此,您可以使用setContentView(A object)而不是setContentView(B object),并且在您的“A XML”文件中,包含GLsurfaceView视图:
<android.opengl.GLSurfaceView android:id="@+id/glsurfaceview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

你可以在 Activity A 中引用 B 对象,因为当你将 setContentView 设置为 A 时,它已经被填充了,而不是 B:

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


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

说实话,我不确定如何完全按照你的要求让它正常工作,但在你的情况下,我不确定最终是否有什么区别。不过,我也还是个新手。如果能以另一种方式学习如何做到这一点,我会很感兴趣的,因为我今天刚问了一个类似的问题。


我不确定我是否理解了您的XML修改建议。这难道不是与我的XML完全相同(我从SurfaceViewOverlay示例中剪切并粘贴的那个)吗?我的主要问题是单击无法传递到Bobject的onTouchEvent()方法。我认为这是因为我正在将其用作渲染器而不是SurfaceViewObject。我正在使用的SurfaceViewObject是通过findViewById()返回的那个。 - madiyaan damha
仔细阅读,我不是建议更改它,而是建议更改您放置它的位置。将SurfaceView XML放在A的布局中,而不是B中,并填充A。当A包含所有视图时,没有必要像您正在做的那样仅填充B的布局。 - user432209
我还是不明白。 我不再使用setContentView(Bobject)。我正在遵循SDK中的示例。我正在使用: setContentView(R.layout.surface_view_overlay); 我很想使用Bobject而不是R.layout.surface_view_overlay,但那样不会显示任何按钮。 - madiyaan damha
如果没有您的实际代码和更好的了解您想要实现什么,我无法提供进一步的帮助。您明确表示您想向应用程序添加按钮。我不明白为什么您要将这些视图添加到SurfaceViewOverlay(对象B)中。从设计角度来看,我认为您通常应该将它们添加到Activity A中,而您的SurfaceView应该是其中的一部分。祝你好运! - user432209

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接