Положение видео внутри VideoView - PullRequest
49 голосов
/ 06 января 2011

Итак, я расширил onMeasure от VideoView, чтобы увеличить его до полноэкранного режима.

вот как:

public void setVideoAspect(int w,int h){
    wVideo=w;
    hVideo=h;
    onMeasure(w, h);
}
 @Override
 protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
 {
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     if(wVideo!=0 && hVideo!=0)
     setMeasuredDimension(wVideo,hVideo);
 }

Я вызываю setVideoAspect () с метриками отображения (ширина, высота) экрана. Проблема в том, что этот метод растягивает видео, чтобы уместить его внутри экрана. Я хочу быть в состоянии сохранить соотношение сторон. (У меня есть видео 4: 3 и размер экрана 3: 2.) Я использовал следующий код, чтобы дать измерениям оставшегося соотношения для вида:

int height =  (int) (metrics.widthPixels*3/(float)4);
                        int width=  metrics.widthPixels;   
                        mVideoView.setVideoAspect(width,height);

Так что это делает работу, но есть проблема: она дает мне видео 4: 3 с шириной экрана и корректно масштабирует высоту, но не центрирует видео. (Он просто обрезает нижнюю часть видео вместо верхней и нижней одинаково.) У меня есть относительный макет, содержащий VideoView с гравитацией VideoView, установленной в центр.

Ответы [ 4 ]

122 голосов
/ 31 января 2011

Попробуйте вместо этого использовать FrameLayout. Я не уверен почему, но если я использую Linear или Relative в своем коде, он не будет центрироваться, а FrameLayout. Вот XML, который помещает мое видео на экран, сохраняя соотношение и центрируя его:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg">
    <!-- Video player -->
    <VideoView
        android:id="@+id/surface_view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"/>
</FrameLayout>
14 голосов
/ 16 августа 2013

Чтобы центрировать видео в RelativeLayout , я добавил оба layout_gravity="center" ad layout_centerInParent="true".Это работает на моем телефоне Android 4.3.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <VideoView android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_centerInParent="true" />
</RelativeLayout>
9 голосов
/ 29 ноября 2013

Ответ Кэмерона программным способом (в случае, если он нужен кому-то, как мне). Этот код находится внутри onCreate действия в моем коде («this» ниже относится к действию)

    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

    FrameLayout fl = new FrameLayout(this);

    fl.setLayoutParams(lp);

    VideoView vv = new VideoView(this);

    FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(lp);

    lp2.gravity = Gravity.CENTER;

    vv.setLayoutParams(lp2);

    fl.addView(vv);

    setContentView(fl);
2 голосов
/ 06 декабря 2018

Это работает для любого видео, сохраняя соотношение сторон видео.Он размещает видео внутри VideoView и выполняет Center Crop или Center Inside точно так же, как ImageView.

Я использую VideoView для покрытия всего ConstraintLayout.Вы можете использовать любой другой макет, возможно, с match_parent в качестве ширины и высоты.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

В onCreate:

Uri uri = //The uri of your video.
VideoView videoView = findViewById(R.id.videoView);
videoView.setVideoURI(uri);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {

        //Get your video's width and height
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();

        //Get VideoView's current width and height
        int videoViewWidth = videoView.getWidth();
        int videoViewHeight = videoView.getHeight();

        float xScale = (float) videoViewWidth / videoWidth;
        float yScale = (float) videoViewHeight / videoHeight;

        //For Center Crop use the Math.max to calculate the scale
        //float scale = Math.max(xScale, yScale);
        //For Center Inside use the Math.min scale. 
        //I prefer Center Inside so I am using Math.min
        float scale = Math.min(xScale, yScale);

        float scaledWidth = scale * videoWidth;
        float scaledHeight = scale * videoHeight;

        //Set the new size for the VideoView based on the dimensions of the video
        ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
        layoutParams.width = (int)scaledWidth;
        layoutParams.height = (int)scaledHeight;
        videoView.setLayoutParams(layoutParams);               
    }
 });

Надеюсь, это кому-нибудь поможет!

...