android - 关于videoview布局的问题

浏览:37日期:2022-11-25

问题描述

新手,看到视频播放的时候,动手弄了个最简单的布局<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: />

</LinearLayout>

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

问题解答

回答1:

尺寸问题直接看VideoView的onMeasure()方法

VideoView的大小跟mVideoWidth和mVideoHeight有关, 看变量名字就知道是播放的媒体的实际尺寸, 你设置播放的媒体么? 大致看了下onMeasure(), 里面的逻辑不是很复杂, 你可以自己看看, 大概就知道是什么问题了

回答2:

一般来说播放器都是要自己定义大小的 因为都会进行缩放,不能采用包裹内容的高度定义方式。

如一楼说的,要了解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 fixedwidth = widthSpecSize;height = heightSpecSize;// for compatibility, we adjust size based on aspect ratioif ( 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 possiblewidth = 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 possibleheight = 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 sizewidth = 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); }

相关文章: