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

Размещение видео внутри видеообзора

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

вот как:

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, с гравитацией видеообзора, установленным в центр.

4b9b3361

Ответ 1

Попробуйте вместо этого использовать FrameLayout. Я не уверен, почему, но если я использую Linear или Relative в моем коде, он не будет FrameLayout, но 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>

Ответ 2

Чтобы центрировать видео в 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>

Ответ 3

Cameron Ответ программным способом (в случае, если кому-то, как мне, нужен он) Этот код находится внутри 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);

Ответ 4

Это работает для любого видео, поддерживающего соотношение сторон видео. Он позиционирует видео внутри 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 width and height
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();

        //Get VideoView 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);               
    }
 });

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