Поддерживает ли Android масштабирование видео?
-
20-09-2019 - |
Вопрос
Можно ли с помощью VideoView установить коэффициент масштабирования для Android?По умолчанию размер видео изменяется в соответствии с закодированным разрешением видео.Могу ли я заставить Android отображать видео в прямоугольнике меньшего или большего размера?
Решение
По умолчанию видео просмотр изменил себя, чтобы соответствовать закодированному разрешению видео.
VideoView
(или SurfaceView
для использования с MediaPlayer
) будет того размера, который вы указали в своем макете. Внутри этого пространства, видео будет воспроизводиться в максимально возможном размере с сохранением соотношения сторон.
Могу ли я заставить Android представить видео в меньший или больший прямо?
Да:сделай свой VideoView
быть нужного вам размера, и Android масштабируется в соответствии с размером VideoView
.
Другие советы
(Я знаю, что это очень старый вопрос, но есть другой способ управления размерами, который здесь не описан, возможно, кто-то найдет его полезным.)
Объявите свои собственные МоеВидеоView класс в своем макете и напишите свой собственный 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);
}
}
Я обнаружил, что когда VideoView помещается внутри RelativeLayout, видео растягивается. оба высота и ширина в соответствии с заданной высотой и шириной VideoView (независимо от соотношения сторон видео).Однако, когда я помещаю VideoView в FrameLayout, видео растягивается по высоте и ширине, пока не будет соответствовать один из указанная высота или ширина VideoView (т.е.это не нарушает соотношение сторон).Странно, я знаю, но это то, что я нашел!
Устанавливать "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);
}
}
Я тоже пытаюсь этого добиться, и пока все получается.Идея состоит в том, чтобы использовать 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();
К FeelGoods отвечать.
Без метода Layout() "центрОбрезка" тип масштаба лучше, но VideoView должен находиться в FrameLayout.
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
Ребята, у меня была другая идея: создать свой собственный класс 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 и убедитесь, что эти методы в вашем собственном классе видеопросмотра, а затем используйте его как видеопросмотр по умолчанию для Android как в XML, так и в файлах классов.
Надеюсь, поможет.