2010-01-14 17 views
26

¿Cómo usar VideoView es posible establecer un factor de escala para Android? Por defecto, la vista de video se redimensiona para ajustarse a la resolución codificada del video. ¿Puedo forzar a Android a procesar un video en un rect más pequeño o más grande?¿Android admite escalar video?

Respuesta

9

Por defecto la vista de vídeo cambia de tamaño sí para adaptarse a la resolución codificado 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 video se reproducirá lo más grande posible mientras se mantiene la relación de aspecto.

¿Puedo forzar a Android a que muestre un video en un rect menor o mayor?

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

+1

Brillante, ¿conoce alguna forma de romper la relación de aspecto? – haseman

+1

Eso no, lo siento. – CommonsWare

+2

Debo añadir que no todas las plataformas realmente hacen esto correctamente. Por ejemplo, el Droid Eris parece escalar el video hasta su resolución original, expandiendo la vista del video a medida que avanza. Fragmentación de plataforma ahoy !! – haseman

56

(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 escriba su propio método onMeasure(). 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); 
} 
} 
+0

esta debería ser la respuesta aceptada – thepoosh

+0

Hice lo que dijiste y funcionó. Gracias, hombre, eres genial ... – Nishant

+0

wow es la respuesta correcta –

3

También estoy tratando de lograr eso y hasta ahora esto ha funcionado bien. La idea es usar setLayoutParams para la vista de video y especificar el tamaño. Es solo un fragmento simple pero da la idea. Compruebe las líneas de 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

Me parece que cuando un VideoView se coloca dentro de un RelativeLayout, el video se extiende tanto altura y anchura para adaptarse a la altura y la anchura especificada de la VideoView (independientemente de la relación de aspecto de vídeo). Sin embargo, cuando coloco VideoView en FrameLayout, el video se extiende en altura y ancho hasta que coincida con uno de el alto o ancho especificado de VideoView (es decir, no rompe la relación de aspecto). Extraño, lo sé, ¡pero eso es lo que encontré!

0

Chicos Tuve otra idea de crear tu propia clase VideoView extendiendo VideoView, con eso puedes hacer lo que quieras ,. exactamente tienes que crear un par de métodos en tu 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); 
} 

crea su propio constructor de la clase ur VideoView y asegurarse de que esto métodos en ur propia clase VideoView luego usarlo como androides como VideoView por defecto en ambos archivos XML y de clase.

Espero que ayude.

10

Para establecer el tipo de escala para "centerCrop"VideoView su onMeasure() y layout() métodos 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); 
    } 
} 
+0

Tuve un problema con esto, tratando de reproducir un video, VideoView estaba escalando primero el ancho obteniendo un LeftAdjustment y luego la altura para que el leftAdjustment original fuera 0 Lo resolví eliminando la inicialización de las variables a la clase private int leftAdjustment = 0; private int topAdjustment = 0; y eliminando leftAdjustment = 0; topAdjustment = 0; desde dentro del método Gracias por la solución, una buena forma de recortar el video sin tener que usar TextureView API 14 y perder compatibilty – AntPachon

+0

debe cambiar la línea del método de diseño a 'super.layout (l + leftAdjustment, t + topAdjustment, r - leftAdjustment, b - topAdjustment); ' . De lo contrario, solo moverá su vidoView, pero no cambiará su tamaño. – rstk

+0

Supongo que la escala se alcanza mediante setMeasuredDimension() en onMeasure(). Usé ese código en https://play.google.com/store/apps/details?id=ru.zenrus.android, y funcionó. ¿Has verificado tu sugerencia? – FeelGood

2

Para Feelgoods respuesta.

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

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