0

Ich versuche, den Zeichenprozess auf einem TextureView in andere TextureViews zu kopieren. Das Hauptziel ist es, in der Lage zu sein, eine "Wand" desselben Videos zu erstellen, das von einer Instanz eines MediaPlayers, der an eine TextureView angehängt ist, abgespielt wird (ich habe diesen Teil fertiggestellt). Dies ist zum einen für Leistungsprobleme, da die Verwendung mehrerer MediaPlayer-Instanzen katastrophale Auswirkungen haben kann, und zum anderen, um sicherzustellen, dass alle Videos miteinander synchronisiert sind.Dupliziere einen TextureView in einen anderen

Vielen Dank für Ihre Antworten/Vorschläge.

Edit: Zwingende OnDraw() funktioniert nicht, weil TextureView OpenGL nutzt auf seiner Oberfläche zu ziehen. Wenn jemand etwas darüber weiß, wie ich dieses Verhalten duplizieren oder überschreiben kann. Andere Vorschläge sind natürlich willkommen!

Antwort

1

Ursprünglich dachte ich Sie Glück sein könnte und dies könnte ein einfacher Fall von Überschreiben der onDraw(Canvas) Methode des TextureView sein, so etwas zu tun:

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(); 
     } 
    } 
} 

Dann werden Sie brauchen nur ein CustomTextureView bis unter die ganzer Bildschirm und es wird viel aussehen, denn es wird sich oft selbst zeichnen.

Dies funktioniert jedoch nicht wie der TextureView. Die TextureView verfügt stattdessen über eine Dummy-Methode onDraw(Canvas) und verwendet stattdessen ihre eigene Methode draw(Canvas), die endgültig ist und daher nicht überschrieben werden kann. Die TextureView verwendet OpenGL, um die Frames von der Kamera zu zeichnen, und es ist ziemlich kompliziert, sich selbst in diesen Prozess zu injizieren, obwohl es möglich scheint, folgende Beispiele zu finden, die diskutiert werden können: here. Dies ist ein fortgeschrittenes Thema und wahrscheinlich ein bisschen viel für einen Samstagmorgen für mich, um eine prägnante Antwort zu schreiben.

Aber ich habe es geschafft, etwas zusammen schnell zu hacken, dass Sie die Vorteile nehmen von möglicherweise in der Lage und laufen mit, obwohl es einige offensichtliche Probleme in Bezug auf Gedächtnis und Framerate hat:

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); 
     } 
    } 
} 

Wenn Sie Ein Raster einer einzelnen TextureView und der Rest sind diese CopyCatTextureViews, Sie können setTextureViewToCopy(TextureView) auf jeder der Kopie Katzen anrufen, um auf die einzelne TextureView zeigen und rufen Sie einfach invalidate() auf jedem der Kopie Katzen, wann immer Sie ein Frame-Update wollen. Offensichtlich ist das nicht ideal, aber es ist schnell und wird sicherlich funktionieren, wenn Sie nur einen einzelnen Rahmen möchten.

Hoffe, das hilft. Viel Glück.

+0

Ich glaube nicht, dass das funktionieren wird. 'TextureView' zeichnet nicht wie normale' View's, und ich denke es macht 'onDraw()' 'final' trotzdem, IIRC. –

+0

Sie haben Recht, es ist endgültig. Lass mich sehen was ich machen kann. – DanielLaneDC

+0

Ich habe meine Antwort mit meinen Ergebnissen bearbeitet. – DanielLaneDC

Verwandte Themen