本來,我想你可能是幸運的,這可能是壓倒一切的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