新手,看到视频播放的时候,动手弄了个最简单的布局
<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中文网2017-04-17 17:48:35
尺寸问题直接看VideoView
的onMeasure()
方法VideoView
的onMeasure()
方法
VideoView
的大小跟mVideoWidth
和mVideoHeight
有关, 看变量名字就知道是播放的媒体的实际尺寸, 你设置播放的媒体么? 大致看了下onMeasure()
VideoView
的大小跟mVideoWidth
和mVideoHeight
有关, 看变量名字就知道是播放的媒体的实际尺寸, 你设置播放的媒体么? 大致看了下onMeasure()
, 里面的逻辑不是很复杂, 你可以自己看看, 大概就知道是什么问题了🎜阿神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);
}