搜尋

首頁  >  問答  >  主體

android - 关于videoview布局的问题

新手,看到视频播放的时候,动手弄了个最简单的布局
<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中文网2888 天前531

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-04-17 17:48:35

    尺寸問題直接看VideoViewonMeasure()方法VideoViewonMeasure()方法

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

    VideoView的大小跟mVideoWidthmVideoHeight有關, 看變數名字就知道是播放的媒體的實際尺寸, 你設定播放的媒體麼?大致看了下onMeasure(), 裡面的邏輯不是很複雜, 你可以自己看看, 大概就知道是什麼問題了🎜

    回覆
    0
  • 阿神

    阿神2017-04-17 17:48:35

    一般來說播放器都是要自己定義大小的 因為都會進行縮放,不能採用包裹內容的高度定義方式。

    如一樓說的,要了解VideoView的版面渲染流程 你可以看看VideoView的源碼

    原始碼裡面有
    // no size yet, just adopt the given spec sizes
    你沒有設定高度就給你預設空間的大小,也就是父容器的大小。就是全螢幕了。

    @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);
        }

    回覆
    0
  • 取消回覆