Преобразование из 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
Если вы хотите скопировать / вставить готовый класс, я написал его здесь:
Вы можете вызвать setRenderer(GLSurfaceView.Renderer), как и в случае GLSurfaceView.