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">
...
Теперь, имея в виду мою исходную иерархию классов, как бы я инициализировал свои взгляды? Что я должен написать в onCreate() моего класса 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" />
И в моем конструкторе класса А я звоню:
// This returns null
Bobject = (B) findViewById(R.id.glsurfaceview);
// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay);
Как мне использовать мой собственный класс, который расширяет glSurfaceView в моем XML-файле /Activity?
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" />
В моем коде отсутствовала подпись конструктора.
Альтернативный способ решить эту проблему - оставить свои представления присоединенными к Деятельности А. Таким образом, вместо использования setContentView(объект B) вы используете setContentView(объект) и внутри своего файла "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
Я, честно говоря, не уверен, как заставить его работать именно так, как вы хотите, но в вашем случае я не уверен, что это в конечном итоге имеет значение. Опять же, я тоже еще новичок. Мне было бы интересно узнать, как сделать это по-другому, поскольку я задал похожий вопрос только сегодня.