2014-09-11 16 views
5

Ich spiele ein Video in einer Oberflächenansicht. Wenn ich das SurfaceView skaliere, werden seine Koordinaten richtig skaliert, aber der Videoinhalt, der abgespielt wird, ist nicht korrekt.Video wird nicht skaliert, wenn SurfaceView skaliert wird

Ich skaliere Ansicht mit der ViewHelper.SetscaleX-Methode. Ich habe mehrere Dinge ausprobiert, konnte aber das Video nicht skalieren..wenn ich die Parameter ändere, wird das Video richtig skaliert. Aber das macht den Übergang langsam. Bitte sehen Sie sich den Schnappschuss des ersten Videos und des letzten Videos an (nach der Skalierung).

initial video with surface view scale 1

video after surfaceView is scaled. See at the bottom-right

+1

"wenn ich die params ändern dann" params? was params? – pskink

+0

LayoutParams der Ansicht, Breite und Höhe der Ansicht ändern. – sanjeev

+0

Ein Beispiel für die Größenänderung einer SurfaceView-Oberfläche finden Sie unter AspectFrameLayout in Grafika (https://github.com/google/grafika/blob/master/src/com/android/grafika/AspectFrameLayout.java). Es wird dort verwendet, um die Größe an das Seitenverhältnis für die Videowiedergabe anzupassen, sollte aber anpassungsfähig sein. – fadden

Antwort

1

es gelöst. Verwenden Sie TextureView anstelle von SurfaceView. Animationen funktionieren nicht in der Oberflächenansicht. Verwenden Sie diesen Link zum Abspielen von Videos mit textureView: Playing video on TextureView

1

Beachten Sie, dass TextureView mehr Akku verbraucht als SurfaceView, während es Ihr Video mit openGL zeichnet, während SurfaceView Hardware-Overlays verwenden kann, falls verfügbar.

Wie andere Leute in den Kommentaren sagten, könnten Sie erreichen, was Sie wollen, indem Sie die layoutParams Ihrer Ansicht ändern.

+1

'layoutParams' verbrauchen viel mehr CPU im Vergleich zu' setScale ... ', so dass die Animation in sehr niedrigen fps liegt – oleynikd

0

Wenn Sie bei SurfaceView bleiben müssen, weil Sie eine Bibliothek von Drittanbietern verwenden, können Sie die Skalierungsanimation mithilfe der Skalierungsanimation reduzieren und NACH dem Ende der Animation die Layoutparams von SurfaceView aktualisieren die richtige Größe und Position. Es ist nicht perfekt, aber sollte gut für diejenigen sein, die keine andere Wahl haben.

0

Fügen Sie eine transparente Ansicht über der Oberflächenansicht wie das relative Layout hinzu, und fügen Sie in dieser transparenten Ansicht einen Skalierungsdetektor hinzu, und führen Sie bei Skalierung diese Skalierung in der Oberflächenansicht oder Texturansicht durch.

Angenommen, die transparente Ansicht heißt videoview.

Videoview.setOnClicklistner(); 

Und wenn implementieren durchgeführt wird, schupp scalefactor zu surfaceview wie

Surfaceview.setscaleX(scalefactor); 
Surfaceview.setscaleY(scalefactor); 

Es funktioniert reibungslos