Domanda

Utilizzando un VideoView è possibile impostare un fattore di scala per Android? Per impostazione predefinita la visualizzazione video stesso ridimensiona per adattarsi alla risoluzione codificata del video. Posso forzare Android di rendere un video in un rettangolo più piccolo o più grande?

È stato utile?

Soluzione

  

Per impostazione predefinita, la ridimensiona video vista   stesso per adattarsi alla risoluzione codificato   del video.

VideoView (o l'SurfaceView per l'uso con MediaPlayer) sarà la dimensione gli si dice di essere nel layout. In quello spazio , il video verrà riprodotto il più grande possibile, mantenendo il rapporto di aspetto.

  

Posso forzare Android di rendere un video   in un rettangolo 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

.

Altri suggerimenti

(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 di classe nel layout e scrivere il proprio onMeasure) metodo (. Ecco come eseguire il video allungato per le dimensioni originali di 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);
 }
}

Trovo che quando un VideoView è collocato all'interno di un RelativeLayout, i tratti VIDEO sia altezza e larghezza per adattarsi all'altezza specificata del VideoView e la larghezza (a prescindere dal video aspetto rapporto). Tuttavia, quando ho posto il VideoView in un FrameLayout, il video si estende in altezza e larghezza fino a che non soddisfa le una delle altezza specificata del VideoView o larghezza (vale a dire che non si rompe le proporzioni ). Strano, lo so, ma questo è quello che ho trovato!

Per impostare il tipo di scala "centerCrop" per VideoView tuoi 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);
    }
}

Sto anche cercando di raggiungere questo e finora questo ha funzionato bene. L'idea è quella di utilizzare i setLayoutParams per la visualizzazione dei video e specificare le dimensioni. E 'solo un frammento semplice, ma dà l'idea. Controllare 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();

Feelgoods risposta.

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

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

Ragazzi ho avuto altra idea di creare la propria classe VideoView estendendo VideoView, con che u può fare quello che mai u want ,. esattamente u have per creare paio di metodi nel vostro 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);
}

fare la propria costruzione per 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.

Speranza che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top