Лучшая практика для наложения XML-макетов на GLSurfaceView?
Я следую примерам из недавней книги (Изучаем OpenGL ES для разработки мобильных игр и графики) и предлагаю сделать следующее: программно добавить новый макет (назовем его settingsLayout) в основное действие, а затем:
LayoutInflater settingsInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View settingsLayoutView = settingsInflater.inflate(R.layout.mySettingsLayout,settingsLayout,false);
settingsLayout.addView(settingsLayoutView);
addContentView(settingsLayout,settingsLayoutParams);
Это прекрасно работает, но я добавил его к обратному вызову для одного из пунктов меню панели действий, и я хотел бы иметь возможность удалить это представление, когда используется кнопка "Назад". Пока это вызывает у меня сильную головную боль.
Между тем, кажется, что наиболее естественный способ реализации динамических представлений (добавляемых в backstack и т. Д.) - это фрагменты. Однако фрагменты должны принадлежать макету, и в настоящее время мой код назначает GLSurfaceView непосредственно как представление контента для моей основной деятельности, вообще не используя макет. Поскольку GLSurfaceView является подклассом View (а не View Group), я не могу использовать его для порождения дочерних элементов, таких как фрагменты.
Автор книги утверждает, что этот подход "гладкий", но не дает никаких других причин для назначения GLSurfaceView непосредственно в качестве представления содержимого. Есть ли проблема с производительностью, о которой нужно знать? Или это так же "гладко", чтобы сделать "главный" макет, к которому принадлежат и мой GLSurfaceView, и впоследствии порожденные представления?
Есть ли какой-то еще более естественный способ заставить кнопки, текстовые поля и т. Д. Динамически появляться и исчезать поверх моего GLSurfaceView?
1 ответ
Я не уверен, что конкретно касается вашей производительности - рендеринг объектов View или рендеринг GL? Ничто из того, что вы делаете, не повлияет на производительность рендеринга GL (кроме, возможно, изменения размера окна).
SurfaceView
а также GLSurfaceView
предоставить прозрачный "заполнитель" в иерархии представления, который другие элементы используют при вычислении макета, но фактические пиксели отображаются на отдельном слое. Вот почему SurfaceView
находится либо за всеми элементами View, либо перед ними - слой передается системному композитору (SurfaceFlinger), который заботится о генерации окончательного изображения дисплея.