Pergunta

Usando um videoview, é possível definir um fator de escala para Android? Por padrão, a visualização de vídeo se redimensiona para ajustar a resolução codificada do vídeo. Posso forçar o Android a renderizar um vídeo em um recto menor ou maior?

Foi útil?

Solução

Por padrão, a visualização de vídeo se redimensiona para ajustar a resolução codificada do vídeo.

VideoView (ou o SurfaceView para usar com MediaPlayer) será o tamanho que você diz para estar no seu layout. Dentro desse espaço, o vídeo será reproduzido o maior possível, mantendo a proporção.

Posso forçar o Android a renderizar um vídeo em um recto menor ou maior?

Sim: faça o seu VideoView ser o tamanho que você deseja, e o Android escalará para caber no tamanho do VideoView.

Outras dicas

(Eu sei que é uma pergunta muito antiga, mas há outra maneira de controlar as dimensões, que não são descritas aqui, talvez alguém seja útil.)

Declarar o seu próprio MyVideoView aula em seu layout e escreva o seu próprio OnMeasure () método. Aqui está como executar o vídeo estendido para as dimensões da View Original:


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

Acho que quando um videoview é colocado dentro de uma relatividade, o vídeo se estende Ambas Altura e largura para ajustar a altura e a largura especificadas da Videoview (independentemente da proporção de vídeo). No entanto, quando coloco o videoview em um Framelayout, o vídeo estica a altura e a largura até corresponder um de A altura ou largura especificada da Videoview (ou seja, não quebra a proporção). Estranho, eu sei, mas foi isso que eu encontrei!

Pôr "centerCrop" tipo de escala para VideoView sua onMeasure() e layout() Os métodos podem ser assim:


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

Também estou tentando conseguir isso e até agora isso funcionou bem. A idéia é usar os SetLayoutParams para a exibição de vídeo e especificar o tamanho. É apenas um fragmento simples, mas dá a ideia. Verifique as linhas do 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();

Para Sentir -se bem responda.

Sem o método layout () o "Centercrop " O tipo de escala é melhor, mas o videoview deve estar em um Framelayout.

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

Caras que eu tive outra ideia, crie sua própria aula de videoview, estendendo o VideoView, com isso que você pode fazer o que quiser. Exatamente você tem que criar alguns métodos em seu 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);
}

Faça seu próprio construtor para sua classe Videoview e verifique se esses métodos na sua própria classe videoview o usem como o Androids padrão videoview nos arquivos XML e da classe.

Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top