Android glSurfaceView с наложением с использованием XML/Java

Я запустил приложение 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">
            ...

Now keeping in mind my original class hierarchy, how would I initialize my views? What should I write in onCreate() of my class A?

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

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

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

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

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-файле/активности?


person madiyaan damha    schedule 08.11.2010    source источник
comment
Я застрял с той же проблемой и не смог найти целое приложение, демонстрирующее эту вещь. Может ли кто-нибудь показать пример приложения? Кажется, я нигде не могу найти этот знаменитый пример SurfaceOverlayView из образцов Android. Заранее спасибо.   -  person rgngl    schedule 07.01.2011


Ответы (2)


Итак, правильный способ сделать это - иметь конструктор в классе 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" />

В моем коде отсутствовала подпись конструктора.

person madiyaan damha    schedule 08.11.2010
comment
Добавляя то же самое, я получаю. Объект конструктора (Context, AttributeSet) не определен. Можете ли вы помочь мне? - person JehandadK; 28.06.2011
comment
Я добавил в класс Renderer. - person JehandadK; 28.06.2011

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

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

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

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


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

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

person user432209    schedule 08.11.2010
comment
Не уверен, что понимаю ваше предложение по модификации XML. Разве это не то же самое, что и мой XML (тот, который я вырезал и вставил из примера SurfaceViewOverlay)? Моя основная проблема заключается в том, что клики не передаются методу Bobject onTouchEvent(). Я считаю, что это связано с тем, что я использую его как Renderer, а не как SurfaceViewObject. Я использую SurfaceViewObject, возвращаемый функцией findViewById(). - person madiyaan damha; 08.11.2010
comment
Читай внимательно, я не предлагаю изменить его, я предлагаю изменить ГДЕ ты его поставил. Поместите XML-код представления поверхности в макет A вместо B и раздуйте A. Нет необходимости раздувать только макет B, как вы это делаете, когда A содержит все ваши представления. - person user432209; 08.11.2010
comment
Я все еще не понимаю. Я больше не использую setContentView(Bobject). Я следую примеру из SDK. Я использую: setContentView (R.layout.surface_view_overlay); Я хотел бы использовать Bobject вместо R.layout.surface_view_overlay, но он не показывает никаких кнопок. - person madiyaan damha; 08.11.2010
comment
Я не могу больше помочь без вашего фактического кода и лучшего понимания того, что вы пытаетесь выполнить. Вы специально заявили, что хотите добавить кнопки в свое приложение. Я не понимаю, почему вы пытаетесь добавить эти представления в наложение SurfaceView (объект B). С точки зрения дизайна, я ожидаю, что вы, как правило, должны добавлять их в Activity A, частью которого должно быть ваше представление поверхности. Удачи! - person user432209; 08.11.2010