0

我想将TextureView上的绘图过程复制到其他TextureView中。主要目标是能够创建一个同一个视频的“墙”,该视频是从附加到TextureView的MediaPlayer的一个实例(我已完成该部分)中播放的。这是首次出现性能问题,因为使用多个MediaPlayer实例可能会产生灾难性的表现,并且确保所有视频都相互同步。将TextureView复制到另一个中

谢谢您的回答/建议。

编辑: 覆盖onDraw()不起作用,因为TextureView使用OpenGL绘制其表面。如果有人对我如何复制或覆盖该行为有一些了解。其他建议当然是欢迎的!

回答

1

本来,我想你可能是幸运的,这可能是压倒一切的TextureView的onDraw(Canvas)方法做这样的事情的简单情况:

final int xTiles = 5; 
final int yTiles = 5; 

@Override 
public void onDraw(Canvas canvas){ 
    int widthPerTile = canvas.getWidth()/xTiles; 
    int heightPerTile = canvas.getHeight()/yTiles; 
    float widthScale = widthPerTile/(float) canvas.getWidth(); 
    float heightScale = heightPerTile/(float) canvas.getHeight(); 

    for(int x = 0; x < xTiles; x++){ 
     for(int y = 0; y < yTiles; y++){ 
      canvas.save(); 
      canvas.translate(x * widthPerTitle, y * heightPerTile); 
      canvas.scale(widthScale, heightScale); 
      super.onDraw(canvas); 
      canvas.restore(); 
     } 
    } 
} 

然后你只需要一个CustomTextureView占用整个屏幕,它会看起来很多,因为它会吸引很多次。

但是,这不是TextureView的工作原理。 TextureView改为具有虚拟onDraw(Canvas)方法,而是使用自己的draw(Canvas)方法,该方法是final的,因此不能被覆盖。 TextureView使用OpenGL从相机中绘制帧,并且在这个过程中注入自己是相当复杂的,尽管看起来可以通过以下示例来讨论,例如可以在here中找到。这确实是一个高级话题,可能在星期六上午有点多,我可以为此写一个简洁的答案。

但是,我还是设法破解的东西在一起,很快,你也许可以利用,并与运行,虽然它有一些明显的问题,至于内存和帧率:

public class CopyCatTextureView extends View { 
    TextureView textureViewToCopy; 

    public CopyCatTextureView(Context context) { 
     super(context); 
    } 

    public void setTextureViewToCopy(TextureView view){ 
     this.textureViewToCopy = view; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if(textureViewToCopy != null){ 
      textureViewToCopy.draw(canvas); 
     } 
    } 
} 

如果你有一个TextureView的网格,剩下的就是这些CopyCatTextureViews,你可以在每个副本猫上调用setTextureViewToCopy(TextureView)来指向单个TextureView,然后每当你想要更新帧时,只需在每个副本猫上调用invalidate()。显然这并不理想,但是如果你只需要一个单一的框架,它很快就可以工作。

希望这会有所帮助。祝你好运。

+0

我不相信这会起作用。 'TextureView'并不像常规的'View'那样绘制,我认为它会使'onDraw()''final',IIRC。 –

+0

你是对的,它是最终的。让我看看我能做些什么。 – DanielLaneDC

+0

我用我的发现编辑了我的答案。 – DanielLaneDC