我有一个像这样设置的VideoView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/player"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<VideoView
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_centerVertical="true" />
<ProgressBar
android:id="@+id/loader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
但VideoView匹配父容器的宽度,然后根据加载的影片的宽高比设置高度 .
我想做的恰恰相反,我希望VideoView与父级的高度相匹配,同时保持宽高比不变,视频将被剪裁在两侧 .
我设法拉伸VideoView来填充父级,但是不保持宽高比 .
另一件事是,我将MediaController添加到VideoView,如下所示:
MediaController controllers = new MediaController(this) {
@Override
public void hide() {
if (state != State.Hidden) {
this.show();
}
else {
super.hide();
}
}
};
controllers.setAnchorView(videoView);
videoView.setMediaController(controllers);
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
controllers.show();
}
});
这很好用,并且控制器始终保持打开状态,但在计算放置视频的位置时(因为它垂直居中),控制器的高度不会被考虑在内 .
我的两个问题是:
-
如何使VideoView与父级的高度匹配,同时保持宽高比?
-
如何让VideoView考虑到它的控制器的高度?
谢谢 .
9 回答
您应该从内置视频视图扩展 .
在显示视频视图之前调用
setVideoSize
,您可以从视频中提取的缩略图中获取视频大小 .因此,当调用视频视图的
onMeasure
时,mVideoWidth
和mVideoHeight
都是> 0 .如果要计算控制器的高度,可以在
onMeasure
方法中自行完成 .希望会有所帮助 .
我用布局解决了这个问题 . 看起来它固定在角落时效果很好,但却导致视频歪斜 . 为了测试我将相对布局的背景更改为#990000以查看红色戳穿 .
关于问题1,我很惊讶没有人提到可能使用MediaPlayer的缩放模式 . https://developer.android.com/reference/android/media/MediaPlayer.html#setVideoScalingMode(int)
它有2种模式 . 它们都总是填满视图区域 . 为了在保持纵横比的同时填充空间,从而裁剪长边,您需要切换到第二模式,
VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
. 这解决了问题的一部分 . 另一部分是更改其他人使用的VideoView 's measuring behavior, just as some of the other answers demonstrate. This is the way I did it, mostly out of laziness and not familiar with the metadata API',欢迎您使用此方法或其他方法之一来修复视图的大小 . 毯式捕获确保在mMediaPlayer存在之前调用它时的安全性,因为它可能被多次调用,并且如果字段名称发生变化,也会回退到旧行为 .因此,在布局中使用此类,只需在有机会的地方更改媒体播放器上的缩放模式 . 如:
我花时间在互联网上搜索这个我没有't find any better solution that can apply to the default video view. So I searched for libraries which will solve my requirement finally I found one ' FullscreenVideoView'(https://github.com/rtoshiro/FullscreenVideoView)这解决了我的要求
Quick and efficient fix:
无需创建从VideoView扩展的自定义视图 . 只需设置一个足够大的值
android:layout_width
. 这会将视频视图的widthSpecMode
设置为View.MeasureSpec.AT_MOST
,然后VideoView的onMeasure()
方法将自动调整其宽度,保持比率 .我尝试了很多解决方案,而我的视频总是1000 * 1000格式,所以我为那些了解其宽高比的人创建了一个简单的解决方案 . 首先在RelativeLayout中创建一个VideoView,如下所示:
然后在加载视频之前更改高度并使用以下编程方式:
当然这仅适用于1:1宽高比,但您可以使用宽高比来改变高度或宽度 .
第一次问题回答了我的问题,而不是答案!我的问题是我在全屏视频下面有一个空白区域 . 我将
layout_height
设置为match_parent
. 解决方案是将其设置为wrap_content
并为父级提供黑色背景 . 那,并且VideoView
在其父级中垂直居中 .Jobbert在Kotlin的回答,万一有人需要它: