Pregunta

El uso de un VideoView es posible establecer un factor de escala para Android? Por defecto la vista de vídeo cambia de tamaño en sí para adaptarse a la resolución del vídeo codificado. ¿Puedo forzar Android para hacer un video en un rect pequeño o más grande?

¿Fue útil?

Solución

  

Por defecto Ver vídeo redimensiones   en sí para adaptarse a la resolución codificada   del vídeo.

VideoView (o el SurfaceView para su uso con MediaPlayer) será el tamaño que usted le indique a estar en su diseño. Dentro de ese espacio , el vídeo se reproducirá tan grande como sea posible mientras se mantiene la relación de aspecto.

  

¿Puedo forzar Android para hacer un video   en un rect pequeño o más grande?

Sí: haga su VideoView sea el tamaño que desee, y Android se escala para ajustarse al tamaño de la VideoView

.

Otros consejos

(Sé que es muy vieja pregunta, pero no hay otra manera de controlar dimensiones, que no se describe aquí, tal vez alguien que le resulte útil.)

Declarar su propia MyVideoView clase en su diseño y escribir su propio onMeasure método () . Aquí es cómo ejecutar el vídeo se extendía a las dimensiones de Punto de vista 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);
 }
}

Me parece que cuando un VideoView se coloca dentro de un RelativeLayout, los tramos de vídeo ambos altura y anchura para adaptarse a la altura y el ancho especificado de la VideoView (independientemente del aspecto de vídeo proporción). Sin embargo, cuando coloco la VideoView en un FrameLayout, el video se extiende altura y la anchura hasta que coincida uno de altura especificada de la VideoView o anchura (es decir, no se rompe la relación de aspecto ). Raro, lo sé, pero eso es lo que he encontrado!

Para establecer el tipo de escala para "centerCrop" VideoView sus métodos onMeasure() y layout() pueden tener este aspecto:


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

También estoy tratando de lograr eso y hasta ahora esto ha funcionado bien. La idea es utilizar los setLayoutParams para la vista de vídeo y especificar el tamaño. Es sólo un fragmento simple, pero da la idea. Compruebe las líneas 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 respuesta.

Sin el layout () método de la " centerCrop" tipo de escala es mejor, pero la VideoView debe estar en un FrameLayout.

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

Los chicos que tenía otra idea de crear su propia clase VideoView extendiendo VideoView, con el que u puede hacer lo que quieres ,. exactamente u tiene que crear par de métodos en su 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);
}

hacer su propio constructor de la clase ur VideoView y asegúrese de que estos métodos en ur propia clase VideoView luego usarlo como androides como VideoView por defecto en ambos archivos XML y de clase.

Espero que ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top