Подтвердить что ты не робот

Поддерживает ли Android масштабирование видео?

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

4b9b3361

Ответ 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.

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