我正在使用带有 TextureView 子级的 ListView。TextureView 使用 MediaPlayer 播放视频。当 TextureView 被回收时,最后一帧会保留在表面上,直到下一个 MediaPlayer 使用它。
什么是“清除”TextureView 的表面(例如黑色)以使旧框架不出现的最简单方法是什么?
我正在使用带有 TextureView 子级的 ListView。TextureView 使用 MediaPlayer 播放视频。当 TextureView 被回收时,最后一帧会保留在表面上,直到下一个 MediaPlayer 使用它。
什么是“清除”TextureView 的表面(例如黑色)以使旧框架不出现的最简单方法是什么?
经过一段时间的努力,我想出了几个可能的解决方案:
a) 使用 GLES 清除表面。您可以在Grafika中看到一个示例(查看 clearSurface() 方法)。我个人不喜欢这个,因为我不认为向黑色的不和谐过渡看起来特别好,如果你还没有使用 GL 代码,这会产生相当多的技术开销。此外,这似乎只适用于 API 17+。
b) 我选择的解决方案是在每次我想播放视频时简单地创建一个新的 TextureView 并将其添加到适当的视图中,而不是重复使用旧的。我会犹豫称这是一个好的解决方案,但这是我能找到的最不可怕的解决方案。
c) 如果您再次播放同一视频,您可以做的一件事是在视频播放完毕后尝试寻找视频的第一帧。然后下一次最后一帧闪烁时,它将不可见,因为它将与视频的开头相同。我在这方面取得了一些成功,但无法让它在所有设备上可靠地工作。这也很明显是一个黑客。
祝你好运,试图解决这个问题非常令人沮丧。
2020 最简单的方法就是简单地将纹理视图的 alpha 设置为 0。
mTextureView.setAlpha(0);