Wednesday, October 17, 2012

Android : Como estirar un vídeo para que ocupe todo el area de un VideoView





¿Qué vamos a ver?

Existe una pequeña falta en uno de los widgets para gestionar archivos multimedia como es el VideoView, este componente no permite por sí mismo que el vídeo ocupe la totalidad del area asignada al propio VideoView pues siempre respeta el aspectRatio del archivo.

Vamos a ver dos soluciones a este defecto.

Otro de los problemas relacionados con este elemento también es que en el emulador la reproducción de vídeo la imagen no suele funcionar, gracias a la referencia del sonido sabemos que se ejecuta correctamente, pero hasta que no pasamos el desarrollo a un terminal físico no podemos comprobar.

Donde estamos y donde queremos llegar


Imágenes de Kansen'sBlog[1]

En este caso vamos a usar dos soluciones, una de ellas es usando elementos que vienen en el core de android. La otra es una View personalizada a la que llamaremos StretchVideoView que extiende la funcionalidad de VideoView.

Estirar Vídeo a través de componentes básicos

He de reconocer que cuando vi esta solución en [Kansen's Blog] vi que era fácil, no se exactamente los mecanismos internos que lo hace funcionar pero lo consigue.

La idea es envolver el elemento VideoView con un RelativeLayout, en el VideoView tendremos que asignar los parámetros android:layout_aligneParentXXX a un valor true.

Desarrollo de nuevo componente

Vamos a crear una nueva clase que podamos usar tanto en XML como en código para conseguir el mismo resultado.

Razones para crear una nueva clase

Normalmente prefiero usar los componentes básicos para evitar problemas en futuro pero en este caso  veo que el desarrollo del componente personalizado ayuda a tener los archivos de recursos XML más limpios y cada día valoro más la claridad en el código.

StretchVideoView.java


Entender el componente personalizado.

Como vemos tan sólo tenemos que modificar el método onMeasure, este método es el que determina el ancho y alto del componente.
Si vemos el código fuente del propio VideoView vemos como es el propio método onMeasure quien comprueba el aspectRatio del vídeo a contener y en función de este propone los valores del componente.
Tan sólo debemos forzar el setMeasuredDimension con los valores recibidos en on Measure.
Aparte he creado los tres constructores para poder crear el elemento tanto desde el código, como poder usarlo en los layout XML.

Usos

Saber como estirar un vídeo es una funcionalidad interesante, pues nos permite desarrollar aplicaciones que reproduzcan vídeo y poder hacer uso de la pantalla al completo.

Aparte de ese uso tan racional podemos pensar en usar vídeos como background, no acomodarse a los límites cuando está funcionando de fondo puede dar una sensación de que algo no funciona bien o una falta de cuidado en los detalles.

Documentación

[VideoView Wrapped]
[VideoView Source Code]
[View:onMeasure doc @developer.android.com]
[View:setMeasuredDimension doc @developer.android.com]
[VideoView playing in emulator issue]

No comments:

Post a Comment