Android glSurfaceView с наложением с использованием XML / Java - PullRequest
6 голосов
/ 08 ноября 2010

Я запустил приложение Android OpenGL, и у меня есть следующие классы:

class A extends Activity
class B extends GlSurfaceView implements Renderer

Когда вызывается onCreate класса A, он создает объект класса 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">
            ...

Теперь, имея в виду мою исходную иерархию классов, как бы я инициализировал свои представления?Что я должен написать в onCreate () моего класса A?

Я пытался использовать:

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

И он действительно рисует кнопки и вид GL на экране, но вид GLне может принять какой-либо ввод от нажатий / кликов.

Вероятно, это связано с тем, что метод boTject onTouchEvent () не вызывается, поскольку он используется только как:

Renderer

, а не как:

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

Как мне использовать мой собственный класс, который расширяет glSurfaceView в моем XML-файле / Activity?

Ответы [ 2 ]

7 голосов
/ 08 ноября 2010

Хорошо, поэтому правильный способ сделать это - иметь конструктор в классе 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 голос
/ 08 ноября 2010

Альтернативный способ решить эту проблему - оставить свои представления присоединенными к Деятельности А. Поэтому вместо использования setContentView (объект B) вы используете setContentView (объект) и внутри своего файла «XML» представление GLsurfaceView:

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

Затем вы можете ссылаться на свой объект B в Деятельности A, потому что он был раздут, когда вы установили ContentView в A вместо B:

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


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

Честно говоря, нетЯ уверен, как заставить его работать именно так, как вы хотите, но в вашем случае я не уверен, что это в конечном итоге имеет значение.Опять же, я тоже еще новичок.Мне было бы интересно узнать, как сделать это альтернативным способом, поскольку я задал похожий вопрос только сегодня.

...