本来,我想你可能是幸运的,这可能是压倒一切的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()
。显然这并不理想,但是如果你只需要一个单一的框架,它很快就可以工作。
希望这会有所帮助。祝你好运。
我不相信这会起作用。 'TextureView'并不像常规的'View'那样绘制,我认为它会使'onDraw()''final',IIRC。 –
你是对的,它是最终的。让我看看我能做些什么。 – DanielLaneDC
我用我的发现编辑了我的答案。 – DanielLaneDC