Как очистить glSurfaceView, на который обращается SupportMapFragment?

Вопрос:

Есть ли способ вручную очистить буфер OpenGL, к которому обращается SupportMapFragment, прежде чем он сделает последующие вызовы glDraw()?

Причина:

У меня есть ActivityGroup, которая содержит два разных встроенных действия (только одно из которых может отображаться на экране в данный момент времени). Вот фрагмент кода макета для него.

<RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:layout_below="@+id/main_header"
 android:background="#313131" >

    <FrameLayout
     android:id="@+id/map_area_one"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:padding="5dp" />
    <FrameLayout
     android:id="@+id/map_area_two"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent" />
</RelativeLayout>              

Представления для обоих действий внутри моей ActivityGroup содержат SupportMapFragment. Первое действие внутри ActivityGroup (с меньшим SupportMapFragment) отображается первым, и его представление становится дочерним элементом FrameLayout с идентификатором map_area_one.

Когда пользователь нажимает кнопку, я запускаю вторую активность внутри ActivityGroup (с большим SupportMapFragment), и ее представление становится дочерним элементом FrameLayout с идентификатором map_area_one. Затем я скрываю вид первой активности.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя представление для 1-го действия больше не видно, я все еще вижу меньший SupportMapFragment 1-го действия (хотя я не могу с ним взаимодействовать). Я приложил изображения ниже.

Я пришел к выводу, что это связано с тем, что оба SupportMapFragments рисуют карту, используя один и тот же OpenGL SurfaceView. Я почти уверен, что по какой-то причине, когда я скрываю первую активность, буфер openGL, который рисует SupportMapFragment, не очищается. Есть две причины, почему я говорю это:

  1. Если я переведу приложение в фоновый режим и верну его на передний план, меньший SupportMapFragment больше не будет виден.
  2. Если я изменю SupportMapFragment большего размера на MapView, использующий GoogleMaps Android v1, этой проблемы не будет. Это связано с тем, что GoogleMaps Android v1 не использует OpenGL.

Картинки

Снимок экрана сразу после того, как пользователь переключается на второе действие. Обратите внимание, что SupportMapFragment первого действия (это меньшая полоса карты внизу) все еще виден.



Скриншот сразу после того, как я перевел приложение в фоновый режим и вернул его на передний план. SupportMapFragment первой активности больше не виден (так и должно быть). Я предполагаю, что второе действие вызвало glClear(), когда приложение снова было выведено на передний план.

Любая помощь или предложения будут оценены. Спасибо.


person Kachi    schedule 04.06.2013    source источник
comment
Я бы тоже хотел получить этот ответ, это также происходит при переключении MapFragments.   -  person joecks    schedule 01.08.2013
comment
Вы нашли решение этой проблемы в конце концов?   -  person JanBo    schedule 02.02.2015


Ответы (1)


Ну, я мог бы, по крайней мере, делегировать проблему, передав определенные параметры во время инициализации SupportMapFragment, касающиеся zIndex:

GoogleMapOptions options = new GoogleMapOptions();
options.zOrderOnTop(true);
fragmentMap = SupportMapFragment.newInstance(options);

надеюсь, это поможет

person joecks    schedule 01.08.2013
comment
Эй, большое спасибо, это сработало для меня. У меня такая проблема только на устройствах ‹4.1. Мне нужно указать параметры в качестве аргументов onCreate() => args.putParcelable(MAP_OPTIONS, options); Где MAP_OPTIONS означает MapOptions, извлеченные из кода класса SDK SupportMapFragment. - person Sulfkain; 02.03.2015