VideoView to match parent height and keep aspect ratio

前端 未结 12 1864
轻奢々
轻奢々 2020-11-28 08:15

I have a VideoView which is set up like this:



        
相关标签:
12条回答
  • 2020-11-28 08:44
    public class MyVideoView extends VideoView {
        private int mVideoWidth;
        private int mVideoHeight;
    
        public MyVideoView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyVideoView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public MyVideoView(Context context) {
            super(context);
        }
    
    
        @Override
        public void setVideoURI(Uri uri) {
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            retriever.setDataSource(this.getContext(), uri);
            mVideoWidth = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
            mVideoHeight = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
            super.setVideoURI(uri);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // Log.i("@@@", "onMeasure");
            int width = getDefaultSize(mVideoWidth, widthMeasureSpec);
            int height = getDefaultSize(mVideoHeight, heightMeasureSpec);
            if (mVideoWidth > 0 && mVideoHeight > 0) {
                if (mVideoWidth * height > width * mVideoHeight) {
                    // Log.i("@@@", "image too tall, correcting");
                    height = width * mVideoHeight / mVideoWidth;
                } else if (mVideoWidth * height < width * mVideoHeight) {
                    // Log.i("@@@", "image too wide, correcting");
                    width = height * mVideoWidth / mVideoHeight;
                } else {
                    // Log.i("@@@", "aspect ratio is correct: " +
                    // width+"/"+height+"="+
                    // mVideoWidth+"/"+mVideoHeight);
                }
            }
            // Log.i("@@@", "setting size: " + width + 'x' + height);
            setMeasuredDimension(width, height);
        }
    }
    
    0 讨论(0)
  • 2020-11-28 08:49

    I've tried a lot of solutions, while my video was always in 1000*1000 format, so I've created an easy solution for people who know their aspect ratio. First create a VideoView in a RelativeLayout like this:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/video_holder"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:clipToPadding="false">
    
          <VideoView  
              android:id="@+id/videoView"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_alignParentBottom="true"
              android:layout_alignParentEnd="true"
              android:layout_alignParentStart="true"
              android:layout_alignParentTop="true" />
    </RelativeLayout>
    

    Then before you load the video change the height and with programmatically like this:

        int i = videoView.getHeight() > videoView.getWidth() ? videoView.getHeight() : videoView.getWidth();
        video_holder.setLayoutParams(new ConstraintLayout.LayoutParams(i, i));
    

    Of course this only works with 1:1 aspect ratio's but you could just use your aspect ratio to change either the height or the width.

    0 讨论(0)
  • 2020-11-28 08:49

    Just put your VideoView inside the RelativeLayout and set the desired size for that relative layout. like below code,

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="300dp">
    
        <VideoView
            android:id="@+id/videoView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerInParent="true" />
    
    </RelativeLayout>
    

    It will work.

    0 讨论(0)
  • 2020-11-28 08:49

    You just need to put Videoview widget in RelativeLayout (changes in xml file only)

    here is reference answer link

    0 讨论(0)
  • 2020-11-28 08:51

    For the first time a question answered my issue instead of answers!! My issue was that I had a white space under the video on full screen. I was setting the layout_height to match_parent. The solution was to set it to wrap_content and give the parent a black background. That, and having the VideoView centered vertically in its parent.

    I wrote this as a comment but then thought someone might have the same issue I had, so here it is as an answer also.

    0 讨论(0)
  • 2020-11-28 08:52

    Jobbert's answer in Kotlin, in case anyone needs it:

    val max = if (videoView.height > videoView.width) videoView.height else videoView.width
    videoView.layoutParams = ConstraintLayout.LayoutParams(max, max)
    
    0 讨论(0)
提交回复
热议问题