我正在尝试将TextureView上的绘图过程复制到其他TextureViews中。主要目标是能够从连接到TextureView的MediaPlayer的一个实例创建一个相同视频的“墙”(我已完成该部分)。这是首次出现性能问题,因为使用多个MediaPlayer实例可能会产生灾难性的性能,并且还要确保所有视频彼此同步。
感谢您的回答/建议。
修改 覆盖onDraw()不起作用,因为TextureView使用OpenGL在其表面上绘制。如果有人对我如何复制或覆盖该行为有一些了解。其他建议当然是受欢迎的!
答案 0 :(得分: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 * widthPerTile, y * heightPerTile);
canvas.scale(widthScale, heightScale);
super.onDraw(canvas);
canvas.restore();
}
}
}
然后你只需要一个CustomTextureView占用整个屏幕就会看起来很多,因为它会抽出很多次。
但是,这不是TextureView的工作方式。而是使用了一个伪onDraw(Canvas)
方法,而是使用自己的draw(Canvas)
方法,这是最终的,因此不能覆盖。 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()
每当你想要一个帧更新时复制猫。显然这不是理想的,但如果你只想要一个框架,那么它很快就会有效。
希望这会有所帮助。祝你好运。
(变量编辑)