studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android video android-videoview

para - manual de programacion android pdf



¿Admite Android escalar video? (7)

Por defecto, la vista de video se redimensiona para ajustarse a la resolución codificada del video.

VideoView (o el SurfaceView para usar con MediaPlayer ) será el tamaño que diga que esté 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 procesar un video en un rect más pequeño o más grande?

Sí: haga que su VideoView sea ​​del tamaño que desee, y Android escalará para ajustarse al tamaño de VideoView .

¿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?


(Sé que es una pregunta muy antigua, pero hay otra forma de controlar las dimensiones, que no se describe aquí, tal vez alguien lo encontrará útil).

Declara tu propia clase MyVideoView en tu diseño y escribe tu propio método onMeasure () . A continuación se explica cómo ejecutar el video estirado a las dimensiones de la 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); } }


Chicos, tuve la 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 tu propio constructor para tu clase VideoView y asegúrate de que este método esté en tu propia clase de videoview y úsala como la videoview predeterminada de androids en los archivos xml y class.

Espero eso ayude.


Me parece que cuando se coloca una VideoView dentro de un RelativeLayout, el video se estira tanto en altura como en ancho para ajustarse al alto y ancho especificados de VideoView (independientemente de la relación de aspecto del video). Sin embargo, cuando coloco VideoView en FrameLayout, el video se estira en altura y en ancho hasta que coincide con uno de los valores de altura o ancho especificados de VideoView (es decir, no rompe la relación de aspecto). Extraño, lo sé, ¡pero eso es lo que encontré!


Para establecer el tipo de escala "centerCrop" para VideoView sus onMeasure() y layout() pueden verse así:

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


Para la respuesta FeelGoods .

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


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