Android поддерживает масштабирование видео? - PullRequest
26 голосов
/ 15 января 2010

С помощью VideoView возможно ли установить масштабный коэффициент для Android? По умолчанию вид видео изменяется в соответствии с кодированным разрешением видео. Можно ли заставить Android рендерить видео в прямоугольник меньшего или большего размера?

Ответы [ 7 ]

56 голосов
/ 07 января 2011

(я знаю, что это очень старый вопрос, но есть другой способ управления измерениями, который здесь не описан, может быть, кто-то найдет его полезным.)

Объявите свой собственный класс 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);
 }
}
10 голосов
/ 18 января 2015

Чтобы установить "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);
    }
}
10 голосов
/ 25 апреля 2012

Я считаю, что когда VideoView помещается в RelativeLayout, видео растягивается и по высоте и ширине, чтобы соответствовать заданным высоте и ширине VideoView (независимо от соотношения сторон видео) , Однако, когда я помещаю VideoView в FrameLayout, видео растягивается по высоте и ширине до тех пор, пока оно не совпадет с одним из указанной высоты или ширины VideoView (то есть оно не нарушает соотношение сторон). Странно, я знаю, но это то, что я нашел!

9 голосов
/ 15 января 2010

По умолчанию размер просмотра видео изменяется сам, чтобы соответствовать закодированному разрешению видео.

VideoView (или SurfaceView для использования с MediaPlayer) будет размером, который вы указали в макете. В этом интервале видео будет воспроизводиться с максимально возможной шириной при сохранении соотношения сторон.

Можно ли заставить Android отображать видео? в меньший или больший прямоугольник?

Да: укажите VideoView того размера, который вам нужен, и Android масштабируется до размера VideoView.

.
3 голосов
/ 25 марта 2011

Я тоже пытаюсь достичь этого, и пока это работает нормально. Идея состоит в том, чтобы использовать 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();
2 голосов
/ 18 марта 2016

К 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);
}
0 голосов
/ 09 августа 2013

Ребята, у меня была другая идея создать свой собственный класс 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 и убедитесь, что эти методы в вашем собственном классе videoview, а затем используйте его как androids по умолчанию videoview для файлов xml и классов.

Надеюсь, это поможет.

...