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

相關問題