2014-09-11 13 views
5

Sto riproducendo un video in una superficie. Quando scala la superficie, la vista è coordinata correttamente, ma il contenuto del video che viene riprodotto non lo è.Il video non viene ridimensionato quando SurfaceView viene ridimensionato

Sto ridimensionando vista utilizzando il metodo ViewHelper.setscaleX. Ho provato diverse cose ma non sono riuscito a ridimensionare il video ... se cambio i parametri, il video viene ridimensionato correttamente. Ma questo rallenta la transizione. Vedere l'istantanea del video iniziale e del video finale (dopo il ridimensionamento).

initial video with surface view scale 1

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

+1

"Se cambio la params poi" params? quali parametri? – pskink

+0

LayoutParam della vista, cambiando larghezza e altezza della vista. – sanjeev

+0

Per un esempio di ridimensionamento di una superficie SurfaceView, vedere AspectFrameLayout in Grafika (https://github.com/google/grafika/blob/master/src/com/android/grafika/AspectFrameLayout.java). Viene utilizzato lì per regolare le dimensioni in modo che corrispondano alle proporzioni per la riproduzione video, ma dovrebbe essere adattabile. – fadden

risposta

1

risolto. Usa TextureView invece di SurfaceView. Le animazioni non funzionano su Surfaceview. Usa questo link per riprodurre video usando textureView: Playing video on TextureView

1

Attenzione che TextureView consumerà più batteria di SurfaceView mentre disegna il tuo video usando openGL mentre SurfaceView può utilizzare gli overlay hardware, se disponibili.

Come hanno detto altre persone nei commenti, è possibile ottenere ciò che si desidera modificando il layoutParam della visualizzazione.

+1

'layoutParams' consuma molta più CPU rispetto a' setScale ... 'quindi l'animazione sarà a fps molto bassi – oleynikd

0

Se si deve stare con SurfaceView perché si sta utilizzando una libreria di terze parti o qualcosa del genere, una soluzione sarebbe ridurla usando l'animazione della scala e DOPO che l'animazione è terminata, aggiornare i layoutparam di SurfaceView dando la dimensione e la posizione corrette. Non è perfetto, ma dovrebbe essere buono per coloro che non hanno altra scelta.

0

Aggiungi una vista trasparente sopra il layout della vista simile alla vista e aggiungi il rilevatore di scalegestione su quella vista trasparente e quando il ridimensionamento si verifica, esegui tale ridimensionamento su vista di superficie o su vista di stampa.

Supponiamo che la vista trasparente sia denominata videoview.

Videoview.setOnClicklistner(); 

E quando viene eseguita la modifica in scala attuare tale scalefactor a surfaceview come

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

che funzionerà senza intoppi

Problemi correlati