Почему TextureView необходимо для отображения SurfaceTexture через PixelCopy.request - PullRequest
0 голосов
/ 16 января 2019

Я использую стороннюю библиотеку для рендеринга на Surface. Эта поверхность прикреплена к SurfaceTexture:

mSurfaceTexture = new SurfaceTexture(mTextureId);

Этот SurfaceTexture не привязан к представлению. Я предполагаю, что, поскольку к нему не прикреплено представление, оно никогда не вызывает onFrameAvailable (да, его слушатель установлен). Чтобы это исправить, у меня есть GLSurfaceView с Renderer, который в onDrawFrame(GL10 gl) вызывает:

 mSurfaceTexture.updateTexImage();

Наконец, у меня есть ImageView, который, ссылаясь на поверхность из SurfaceTexture, вызывает

PixelCopy.request(mSurface,plotBitmap,listener,getHandler());
setImageBitmap(plotBitmap); 

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

Так что я бы хотел видеть, что в SurfaceTexture. Я обнаружил, что у меня должен быть TextureView, который я добавляю в иерархию представлений, для которого SurfaceTexture имеет значение, указанное выше:

mTextureView.setSurfaceTexture(mSurfaceTexture);

ОДНАКО запутанный бит в том, что TextureView на самом деле ничего не отображает сам (это белый квадрат), он только позволяет ImageView PixelCopy запросам отображать то, что отображается на поверхности , У кого-нибудь есть идея, почему это так? Что-то о потребителях и производителях, находящихся на разных GLThreads?

Примечание: onFrameAvailable вызывается, когда нет экземпляра TextureView, но не вызывается, когда присутствует TextureView.

...