Я использую стороннюю библиотеку для рендеринга на 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
.