Динамически показывать / скрывать несколько OpenGL-представлений на Android - PullRequest
3 голосов
/ 14 ноября 2011

Я использую OpenGL для динамического рендеринга изображений на GLSurfaceView в Android. Приложение прекрасно работает для (статического) макета на основе XML с несколькими экземплярами пользовательского GLSurfaceView. (вверху слева и справа вверху на изображении)

Если эти экземпляры динамически взаимозаменяются по значению видимости, последнее видимое OpenGL-изображение все еще находится поверх нового. (внизу слева и справа внизу на изображении)

http://www.abload.de/img/appxbunc.jpg

верхнее левое изображение: 4 экземпляра, нормальный размер

верхняя правая картинка: 4 экземпляра, большой размер

нижнее левое изображение: 1 экземпляр, нормальный размер (верхнее левое изображение как нежелательное наложение)

нижнее правое изображение: 1 экземпляр, большой размер (верхнее левое изображение как нежелательное наложение)

Что я пробовал до сих пор:

  • не удалил нежелательные экземпляры:
    • скрыть неиспользуемые изображения с помощью Android :: visibility = "ушел" (не работает гладко)
    • переместить виды из видимой области и изменить их размер до 0 на 0
    • используйте простые цвета вместо динамических изображений для упрощения вывода
    • вызвать перерисовку представления, сделав его недействительным (на самом деле я попробовал почти все функции, предлагаемые представлением)
    • очистка различных буферов в функции onDraw () - (на самом деле я попробовал почти все функции, предлагаемые GLSurfaceView)
    • force onPause () - событие для остановки рендерера
    • используйте ViewPager для переключения между представлениями
  • успешно удалили ненужные экземпляры:
    • перезапустите OpenGL, повторно войдя в приложение (так использовать нельзя)
    • рекурсивно скрывает все остальные GLSurfaceViews с помощью android :: visibility = "пошел" (глючил движок, поэтому он перестал работать)

Нежелательные изображения не изменяются при перекомпоновке макета, как при изменении видимости вида. Они видны только в том случае, если GLSurfaceView находится поверх другого GLSurfaceView (скрыто с помощью android :: visibility = "seen"). Нет проблем, если вместо этого используется ImageView. У первого созданного экземпляра такой проблемы нет, потому что он находится сверху (или снизу?) Дочернего стека и поверх его дочерних элементов.

Я думаю, Android поддерживает только одно представление на основе OpenGL, которое используется всеми экземплярами GLSurfaceView. Кажется, что все экземпляры имеют некоторые общие настройки (особенно видимость), поэтому их нельзя просто выключить или переместить.

GLSurfaceView-класс:

public class Panel extends GLSurfaceView implements Renderer {
  private static native void nativeRender();

  public Panel(Context context) {
    super(context);

    this.setRenderer(this);
    this.setRenderMode(RENDERMODE_WHEN_DIRTY);
  }

  public void onDrawFrame(GL10 gl) {
    nativeRender();
  }

  public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
  }
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  }
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    super.surfaceDestroyed(holder);
  }

    public void callback() {
        this.requestRender();
    }
}

Так можно ли использовать несколько OpenGL-представлений внутри (особенно сверху) друг друга? Есть ли лучший способ их поменять без использования значения видимости?

1 Ответ

0 голосов
/ 20 февраля 2017

У меня возникла та же проблема, и я не смог ее решить, так как я наконец-то понял, что один GLSurfaceView будет одной вершиной, если мы сделаем другой видимость GLSurfaceView Унесенным, и он не вернется на верхнюю часть экрана. Но я решил проблему с помощью трюка. Вместо того, чтобы скрывать вид, я изменил его ширину и высоту на 1 px, он делает вид невидимым для пользователя. И когда мне нужно показать его, я изменил его ширину и высоту с помощью LayoutParams. И это частично решило мою проблему. Я показываю вам мой код

    <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/smallVideoRenderLayoutIncoming"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:background="@color/transparent"
    android:orientation="vertical"/>


<LinearLayout
    android:id="@+id/largeVideoRenderLayoutIncoming"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ConstantFunctions.dpToPx(120),ConstantFunctions.dpToPx(170));
smallVideoRenderLayoutIncoming.setLayoutParams(layoutParams);

Когда мне нужно показать его, я меняю его размер по мере необходимости.

...