Преобразование из GLSurfaceView в TextureView (через GLTextureView)

Когда был выпущен Android 4.0 (Ice Cream Sandwich), в SDK появилось новое представление. Этот вид является TextureView. В документации говорится, что TextureView можно использовать для отображения содержимого сцены OpenGL.

Когда вы посмотрите, как это сделать, вы найдете ссылку на один пример.

https://groups.google.com/forum/?fromgroups=

Однако я хотел просто заменить GLSurfaceView на TextureView, оставить остальную часть моего кода прежним и просто получить преимущества TextureView.

4 ответа

Ответ:

1) Начните с исходного кода GLSurfaceView, назовите файл GLTextureView.java

2) Измените заголовок на: GLTextureView расширяет TextureView реализует SurfaceTextureListener

3) Переименуйте конструкторы в GLTextureView. Удалить код из метода init().

4) Организовать импорт. Всегда выбирайте опцию без GLSurfaceView.

5) Найдите каждый экземпляр SurfaceHolder и измените его на SurfaceTexture

6) Добавьте Не реализованные методы для SurfaceTextureListener, каждый метод должен быть следующим:

  • onSurfaceTextureAvailable - surfaceCreated (поверхность)
  • onSurfaceTextureDestroyed - surfaceDestroyed (surface), (вернуть true)
  • onSurfaceTextureSizeChanged - surfaceChanged (поверхность, 0, ширина, высота)
  • onSurfaceTextureUpdated - requestRender ()

7) Должна быть одна строка, где делается вызов getHolder (), измените его на getSurfaceTexture ()

8) В методе init() поставьте следующую строку setSurfaceTextureListener(this)

Затем добавьте OnLayoutChangeListener и позвони surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top),

После этого вы сможете заменить код GLSurfaceView на GLTextureView и получать выгоды от GLTextureView, Также убедитесь, что ваше приложение поддерживает аппаратное ускорение и что ваш рендерер расширяется GLTextureView.Renderer.

Brilliant!

Небольшое дополнение к блестящему ответу мистера Гудейла:

Я думаю, что версия 4.1.1 GLSurfaceView была изменена, чтобы избежать рендеринга на поверхности нулевой ширины / высоты. И, кажется, нет никакого бесплатного уведомления onSurfaceTextureChanged, непосредственно следующего за onSurfaceTextureAvailable.

Если вы начинаете с исходниками 4.1.1, onSurfaceTextureAvailable должен выглядеть следующим образом:

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
        int height) 
{
    this.surfaceCreated(surface);
    this.surfaceChanged(surface, 0,width,height);
}

Кроме этого, я был на ногах примерно через пять минут! Благодарю.

Спасибо мистеру Гудейлу и мистеру Дэвису за ответы!

У меня есть некоторые дополнительные сведения о преобразовании GLSurfaceView в GLTextureView. Первое о режиме рендеринга. Как описано здесь, просто удалите запрос requestRender() в onSurfaceTextureUpdated.

Второе о
mGLESVersion = SystemProperties.getInt("ro.opengles.version", ConfigurationInfo.GL_ES_VERSION_UNDEFINED); Просто используйте ссылку, но вам нужен Context, чтобы сделать context.getClassLoader(); Вы можете вызвать версию getInt для отражения из init() и сохранить результат в статическом поле sGLESVersion = getInt(getContext(), "ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

И последнее самое простое изменение касается EGLLogWrapper.getErrorString(error); Просто скопируйте getErrorString из источников EGLLogWrapper.

Смотрите окончательную версию моего преобразования GLSurfaceView в GLTextureView на GitHub Gist

Если вы хотите скопировать / вставить готовый класс, я написал его здесь:

GLTextureView

Вы можете вызвать setRenderer(GLSurfaceView.Renderer), как и в случае GLSurfaceView.

Другие вопросы по тегам