Переходы между фрагментами Android с помощью GLSurfaceView

У меня есть GLSurfaceView во фрагменте, причем это мой основной фрагмент. Когда я делаю переход от фрагмента с моим GLSurfaceView к другому фрагменту без GLSurfaceView, GLSurfaceView немного перемещается вверх перед началом перехода.

Я попытался установить GLSurfaceView.setZOrderOnTop(true), это не работает, и на самом деле это приносит больше вреда, чем пользы в этой ситуации, так как моя реклама и панель навигации становятся скрытыми.

Я попытался скрыть фрагмент, на котором размещается GLSurfaceView, но это не дало никакого эффекта.

Я попытался приостановить фрагмент, содержащий GLSurfaceView , поэтому одновременная приостановка GLSurfaceView не имеет никакого эффекта.

Когда GLSurfaceView перемещается вверх, экран становится черным там, где должен быть GLSurfaceView. Кажется, что черная область на экране характерна для переходов фрагментов, поскольку, если я удалю переход и просто заменю транзакцией фрагмента, движение glsurfaceview исчезнет. Это не решение, потому что мне нужны переходы в моем приложении от одного фрагмента к другому.

Наконец, я понимаю, что ondestroyview вызывается для фрагмента с GLSurfaceView, таким образом уничтожая представление перед анимацией перехода к следующему фрагменту, и я думаю, что это может быть проблемой.

Вот некоторый код...

Добавление фрагмента с помощью glsurfaceview

        //clear all fragments from the back stack if there are any
        getSupportFragmentManager()
        .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

        //start a new deploy fragment
        getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.container, new DeployFragment(), "Main Fragment")
        .commit();

замена фрагмента glsurfaceview фрагментом списка предпочтений

         getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left,
         R.anim.enter_from_left, R.anim.exit_to_right)
        .replace(R.id.container, new SettingsFragment(), "Settings Fragment")
        .addToBackStack(null)
        .commit(); 

При переходе от DeployFragment (фрагмент glsurfaceview) к SettingsFragment (фрагмент обычного списка) GLSurfaceView немного перемещается вверх, возможно, на размер высоты двух панелей действий, расположенных друг над другом. При перемещении вверх glsurfaceview также отображается черная область на экране, где должен быть GLSurfaceView, но это не так.

Любые идеи, как решить эту проблему?


ВИДЕО ПРОБЛЕМЫ

http://youtu.be/RUSNBd9iuXs

сразу после выбора опции вы видите, что GLSurfaceView перемещается вверх, открывая черное пространство



person SavageKing    schedule 31.07.2014    source источник
comment
Имейте в виду, что поверхности SurfaceView составляются независимо от всех элементов пользовательского интерфейса представления. Кроме того, их положением управляет диспетчер окон, а не приложение. Полную версию см. на странице source.android.com/devices/graphics/architecture.html< /а>   -  person fadden    schedule 01.08.2014
comment
Вы нашли решение этой проблемы при использовании фрагментов поддержки? Я сталкиваюсь с той же проблемой прямо сейчас   -  person Joakim    schedule 19.10.2016


Ответы (2)


Единственный способ анимировать переход для SurfaceView — нарисовать перед содержимым растровое изображение и установить его в качестве источника изображения поверх макета с поверхностью. Но обратите внимание, поскольку это большое растровое изображение, если это полноэкранный макет для Android 2.x, этот подход может привести к сбою вашего приложения из-за отсутствия собственной кучи (не java), поэтому я рекомендую делать это только для ics +

person curioushikhov    schedule 01.08.2014
comment
Итак, я должен нарисовать все, что находится на моем glsurfaceview, в растровое изображение, а затем установить это растровое изображение для просмотра изображения внутри фрагмента, убедившись, что изображение является полноэкранным... и затем перейти к другому фрагменту, если я вас правильно понял? Если это так, как мне преобразовать glsurfaceview в растровое изображение? Кроме того... Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, что glsurfaceview уничтожается, когда я перехожу к другому фрагменту, поскольку вызывается ondestroyview, уничтожая glsurfaceview внутри фрагмента. Я думаю, что это может быть причиной всех проблем. - person SavageKing; 02.08.2014

Думаю, я понял это. Я часами ломал голову над этим, поэтому я опубликую то, что я считаю исправлением, но, возможно, не ЛУЧШИМ ответом. Я обнаружил, что если я использую фрагменты поддержки с glsurfaceview и пытаюсь анимировать переход к другому фрагменту, то получаю странную проблему, описанную выше в вопросе и показанную на видео.

Если я использую фрагменты без поддержки, то этой проблемы там не существует. Использование фрагментов без поддержки сопряжено с целым рядом других проблем, поэтому, если кто-то придумает решение этой проблемы при использовании фрагментов с поддержкой, я прислушаюсь.

проблемы с использованием неподдерживаемых фрагментов

  • я должен по крайней мере ориентироваться на API 11 (сотовый) или выше, со временем это станет меньшей проблемой

  • я использую вложенные фрагменты, поэтому у меня есть выбор: смешивать поддержку с неподдерживаемыми фрагментами, что неприятно, или ориентироваться на API 19 или выше, чтобы использовать getChildFragmentManager() с неподдерживаемыми фрагментами, что тоже неприятно.

  • я использую пейджер просмотра, поэтому похоже, что мне снова нужно смешивать поддержку с отсутствием поддержки или импортировать fragmentpageradapter для v13, который совместим с API 13 и выше.

Спасибо!

person SavageKing    schedule 02.08.2014