android - 关于videoview布局的问题
PHP中文网
PHP中文网 2017-04-17 17:46:35
0
2
480

新手,看到视频播放的时候,动手弄了个最简单的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<VideoView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/vv_show"/>

</LinearLayout>

在VideoVidw里面设置layout_width,layout_height,不管设置成match_parent还是wrap_content的,这个VideoView还是撑满了整个屏幕(程序就是一个简单的布局,除了自动代码以外,没有加一点代码),发现这里wrap_content就一点用都没有,请教前辈这个是什么问题

PHP中文网
PHP中文网

认证0级讲师

reply all(2)
洪涛

For size issues, please refer directly to the onMeasure() method of VideoViewVideoViewonMeasure()方法

VideoView的大小跟mVideoWidthmVideoHeight有关, 看变量名字就知道是播放的媒体的实际尺寸, 你设置播放的媒体么? 大致看了下onMeasure()

The size of VideoView is related to mVideoWidth and mVideoHeight. You can tell by looking at the variable name that it is the actual size of the media being played. Have you set the media to be played? ? After a brief look at onMeasure(), the logic inside is not very complicated. You can take a look at it yourself and you will probably know what the problem is🎜
阿神

Generally speaking, the player has to define its own size. Because it will be scaled, the height definition method of wrapping the content cannot be used.

As mentioned on the first floor, to understand the layout rendering process of VideoView, you can take a look at the source code of VideoView

The source code contains
// no size yet, just adopt the given spec sizes
If you don’t set the height, it will give you the default space size, which is the size of the parent container. It's full screen.

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //Log.i("@@@@", "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", "
        //        + MeasureSpec.toString(heightMeasureSpec) + ")");

        int width = getDefaultSize(mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(mVideoHeight, heightMeasureSpec);
        if (mVideoWidth > 0 && mVideoHeight > 0) {

            int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);

            if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) {
                // the size is fixed
                width = widthSpecSize;
                height = heightSpecSize;

                // for compatibility, we adjust size based on aspect ratio
                if ( mVideoWidth * height  < width * mVideoHeight ) {
                    //Log.i("@@@", "image too wide, correcting");
                    width = height * mVideoWidth / mVideoHeight;
                } else if ( mVideoWidth * height  > width * mVideoHeight ) {
                    //Log.i("@@@", "image too tall, correcting");
                    height = width * mVideoHeight / mVideoWidth;
                }
            } else if (widthSpecMode == MeasureSpec.EXACTLY) {
                // only the width is fixed, adjust the height to match aspect ratio if possible
                width = widthSpecSize;
                height = width * mVideoHeight / mVideoWidth;
                if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {
                    // couldn't match aspect ratio within the constraints
                    height = heightSpecSize;
                }
            } else if (heightSpecMode == MeasureSpec.EXACTLY) {
                // only the height is fixed, adjust the width to match aspect ratio if possible
                height = heightSpecSize;
                width = height * mVideoWidth / mVideoHeight;
                if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {
                    // couldn't match aspect ratio within the constraints
                    width = widthSpecSize;
                }
            } else {
                // neither the width nor the height are fixed, try to use actual video size
                width = mVideoWidth;
                height = mVideoHeight;
                if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) {
                    // too tall, decrease both width and height
                    height = heightSpecSize;
                    width = height * mVideoWidth / mVideoHeight;
                }
                if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) {
                    // too wide, decrease both width and height
                    width = widthSpecSize;
                    height = width * mVideoHeight / mVideoWidth;
                }
            }
        } else {
            // no size yet, just adopt the given spec sizes
        }
        setMeasuredDimension(width, height);
    }
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template