2010-01-14 12 views
26

Utilizzo di VideoView È possibile impostare un fattore di scala per Android? Di default la vista video si ridimensiona per adattarsi alla risoluzione codificata del video. Posso forzare Android a rendere un video in un rect più piccolo o più grande?Android supporta il ridimensionamento dei video?

risposta

9

per impostazione predefinita la visualizzazione di video ridimensiona stesso per adattarsi alla risoluzione codificata del video.

VideoView (o SurfaceView per l'uso con MediaPlayer) sarà la dimensione gli si dice di essere nel layout. All'interno dello spazio, il video verrà riprodotto il più grande possibile mantenendo le proporzioni.

Posso forzare Android a rendere un video in un rect più piccolo o più grande?

Sì: rendere il vostro VideoView essere la dimensione che si desidera, e Android scalerà per adattarsi alle dimensioni del VideoView.

+1

Brillante, sai di un modo per rompere le proporzioni? – haseman

+1

Che io non, mi dispiace. – CommonsWare

+2

Devo aggiungere che non tutte le piattaforme lo fanno correttamente. Ad esempio, il Droid Eris sembra ridimensionare il video fino alla sua risoluzione nativa, espandendo la visualizzazione del video man mano che procede. Frammentazione della piattaforma ahoy !! – haseman

56

(lo so che è molto vecchia questione, ma c'è un altro modo per controllare le dimensioni, che non viene qui descritto, forse qualcuno lo troverà utile.)

Dichiarare il proprio MyVideoView classe nel layout e scrivi il tuo metodo onMeasure(). Ecco come eseguire il video allungato alle dimensioni originali della vista:


public class MyVideoView extends VideoView { 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int width = getDefaultSize(0, widthMeasureSpec); 
    int height = getDefaultSize(0, heightMeasureSpec); 

    setMeasuredDimension(width, height); 
} 
} 
+0

questa dovrebbe essere la risposta accettata – thepoosh

+0

Ho fatto quello che dici e ha funzionato. Grazie amico sei fantastico ... – Nishant

+0

wow è corretto asnwer –

3

Sto anche cercando di ottenere ciò e finora questo ha funzionato bene. L'idea è di usare setLayoutParams per la vista video e specificare la dimensione. È solo un semplice frammento ma dà l'idea. Controlla le linee LayoutParams.

VideoView mVideoView = new VideoView(this); 

//intermediate code 

mVideoView.setVideoPath("/sdcard/VIDEO0007.3gp"); 
MediaController mController = new MediaController(this); 
mVideoView.setMediaController(mController); 
mController.setOnTouchListener(new View.OnTouchListener() { 

public boolean onTouch(View v, MotionEvent event) { 
    int width = mVideoView.getMeasuredWidth(); 
    int height = mVideoView.getMeasuredHeight(); 
    //we add 10 pixels to the current size of the video view every time you touch  
    //the media controller. 
    LayoutParams params = new LinearLayout.LayoutParams(width+10, height+10); 
    mVideoView.setLayoutParams(params); 

    return true; 
} 
}); 

mVideoView.requestFocus(); 
mVideoView.start(); 
9

Trovo che quando un VideoView è posizionato all'interno RelativeLayout, il video estende sia altezza e larghezza per adattarsi all'altezza specificata del VideoView e larghezza (indipendentemente dal formato video). Tuttavia, quando inserisco VideoView in un FrameLayout, il video allunga l'altezza e la larghezza finché corrisponde a uno di l'altezza o la larghezza specificata della Vista video (ovvero non rompe le proporzioni). Strano, lo so, ma è quello che ho trovato!

0

Ragazzi Ho avuto altre idee per creare la tua classe VideoView estendendo VideoView, con cui puoi fare quello che vuoi ,. esattamente devi creare un paio di metodi nella tua VideoView.

public void setDimensions(int w, int h) { 
    this.mForceHeight = h; 
    this.mForceWidth = w; 

} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    setMeasuredDimension(mForceWidth, mForceHeight); 
} 

rendere il proprio costruttore di ur classe VideoView e assicurarsi che questa modalità di ur propria classe VideoView quindi utilizzarlo come come androidi predefinita VideoView in entrambi i file XML e di classe.

Spero che aiuti.

10

Per impostare il tipo di scala "centerCrop" per VideoView tuo onMeasure() e layout() metodi possono apparire come segue:


public class CenterCropVideoView extends VideoView { 
    private int leftAdjustment; 
    private int topAdjustment; 

... 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     int videoWidth = getMeasuredWidth(); 
     int videoHeight = getMeasuredHeight(); 

     int viewWidth = getDefaultSize(0, widthMeasureSpec); 
     int viewHeight = getDefaultSize(0, heightMeasureSpec); 

     leftAdjustment = 0; 
     topAdjustment = 0; 
     if (videoWidth == viewWidth) { 
      int newWidth = (int) ((float) videoWidth/videoHeight * viewHeight); 
      setMeasuredDimension(newWidth, viewHeight); 
      leftAdjustment = -(newWidth - viewWidth)/2; 
     } else { 
      int newHeight = (int) ((float) videoHeight/videoWidth * viewWidth); 
      setMeasuredDimension(viewWidth, newHeight); 
      topAdjustment = -(newHeight - viewHeight)/2; 

     } 
    } 

    @Override 
    public void layout(int l, int t, int r, int b) { 
     super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment); 
    } 
} 
+0

Ho avuto un problema con questo, cercando di riprodurre un video, la VideoView stava ridimensionando prima la larghezza ottenendo una Regolazione sinistra e poi l'altezza in modo che la Regolazione sinistra originale era impostata su 0 Ho risolto rimuovendo l'inizializzazione delle variabili nella classe private int leftAdjustment = 0; private int topAdjustment = 0; e rimozione leftAdjustment = 0; topAdjustment = 0; dall'interno del metodo Grazie per la soluzione, un buon modo per ritagliare il video senza dover usare TextureView API 14 e perdere la compatibilità – AntPachon

+0

devi cambiare la linea del metodo di layout in 'super.layout (l + leftAdjustment, t + topAdjustment, r - leftAdjustment, b - topAdjustment); ' . Altrimenti sposterà semplicemente il tuo vidoView, ma non cambierà la sua dimensione – rstk

+0

Suppongo che il ridimensionamento sia raggiunto da setMeasuredDimension() in onMeasure(). Ho usato quel codice in https://play.google.com/store/apps/details?id=ru.zenrus.android, e ha funzionato. Hai controllato il tuo suggerimento? – FeelGood

2

To Feelgoods risposta.

Senza il metodo layout() il tipo di scala "centerCrop" è migliore, ma VideoView deve essere in un FrameLayout.

@Override 
public void layout(int l, int t, int r, int b) { 
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment); 
} 
Problemi correlati