Используя VideoView, можно установить масштабный коэффициент для Android? По умолчанию видеоизображение изменяет размеры, чтобы соответствовать кодированному разрешению видео. Могу ли я заставить Android отображать видео в меньшем или большем прямоугольнике?
Поддерживает ли Android масштабирование видео?
Ответ 1
По умолчанию размер видеоизображения изменяется сам по себе соответствовать кодированному разрешению видео.
VideoView
(или SurfaceView
для использования с MediaPlayer
) будет размером, указанным вами в вашем макете. В этом пространстве видео будет воспроизводиться как можно больше, сохраняя соотношение сторон.
Могу ли я заставить Android отображать видео в меньший или больший прямоугольник?
Да: сделайте свой VideoView
размером, который вы хотите, и Android будет масштабироваться, чтобы соответствовать размеру VideoView
.
Ответ 2
(Я знаю, это очень старый вопрос, но есть еще один способ контроля измерений, который здесь не описан, может быть, кто-то найдет его полезным.)
Объявите свой собственный класс MyVideoView в своем макете и напишите свой собственный метод onMeasure(). Вот как запустить видео растягивается в оригинальные габаритные размеры:
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);
}
}
Ответ 3
Чтобы установить тип шкалы "centerCrop"
для VideoView
, ваши методы onMeasure()
и layout()
могут выглядеть следующим образом:
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);
}
}
Ответ 4
Я обнаружил, что когда VideoView размещается внутри RelativeLayout, видео растягивается и по высоте и ширине, чтобы соответствовать указанной высоте и ширине видеоизображения (независимо от соотношения сторон видео). Однако, когда я размещаю VideoView в FrameLayout, видео растягивает высоту и ширину, пока не будет соответствовать одному из видеорекламы, указанной по высоте или ширине (т.е. Она не нарушит соотношение сторон). Странно, я знаю, но это то, что я нашел!
Ответ 5
Я также пытаюсь достичь этого, и до сих пор это работало нормально. Идея состоит в том, чтобы использовать setLayoutParams для просмотра видео и указать размер. Это просто простой фрагмент, но он дает идею. Проверьте строки 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();
Ответ 6
Ответ FeelGoods.
Без метода layout() тип масштаба < centerCrop лучше, но VideoView должен находиться в FrameLayout.
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
Ответ 7
Ребята, у меня была другая идея, создайте свой собственный класс VideoView, расширив VideoView, и вы сможете делать то, что захотите. Вам нужно создать несколько методов в вашем 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);
}
создайте свой собственный конструктор для класса VideoView ur и убедитесь, что эти методы в собственном классе видеовидео, а затем используют его как и андроид по умолчанию для видеовидео в файлы xml и class.
Надеюсь, что это поможет.