如何保存我的Android VideoView';s的纵横比仅与高度成比例?
我想设置一个填充屏幕并保留纵横比的视频。但是,我不希望视频与手机的纵横比匹配 如果我的屏幕的纵横比为18.9:9,而视频的纵横比为16:9,则当我将视频放在继承fill_parent的VideoView中时,它会出现拉伸。如果我没有设置fill_parent,那么视频将保留其纵横比,但只占屏幕的1/3以下,因为纵横比由其宽度而不是高度决定。这是不可取的 我想用视频垂直填充屏幕,不管部分宽度是否被剪掉 当前代码:如何保存我的Android VideoView';s的纵横比仅与高度成比例?,android,kotlin,android-videoview,Android,Kotlin,Android Videoview,我想设置一个填充屏幕并保留纵横比的视频。但是,我不希望视频与手机的纵横比匹配 如果我的屏幕的纵横比为18.9:9,而视频的纵横比为16:9,则当我将视频放在继承fill_parent的VideoView中时,它会出现拉伸。如果我没有设置fill_parent,那么视频将保留其纵横比,但只占屏幕的1/3以下,因为纵横比由其宽度而不是高度决定。这是不可取的 我想用视频垂直填充屏幕,不管部分宽度是否被剪掉 当前代码: window.setFormat(PixelFormat.TRANSLUCENT)
window.setFormat(PixelFormat.TRANSLUCENT)
val videoView = findViewById < VideoView > (videoView)
val video = Uri.parse("android.resource://" + packageName + "/" +
R.raw.bgvideo)
videoView.setVideoURI(video)
videoView.setOnPreparedListener {
mp: MediaPlayer - >
mp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING)
mp.isLooping = true
mp.setScreenOnWhilePlaying(false)
}
videoView.start()
window.setFormat(像素格式.半透明)
val videoView=findViewById(videoView)
val video=Uri.parse(“android.resource://”+packageName+“/”+
R.raw.bg(视频)
videoView.setVideoURI(视频)
videoView.setOnPreparedListener{
mp:MediaPlayer->
mp.setVideoScalingMode(MediaPlayer.VIDEO\u缩放\u模式\u缩放到\u适合\u裁剪)
mp.isLooping=true
mp.setScreenOnWhilePlaying(假)
}
videoView.start()
XML:
当前结果:
预期结果:
以编程方式调整
视频视图的尺寸
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--parent needs to be matching the screen height-->
<!--VideoView layout_width doesn't matter-->
<VideoView
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
此代码不关心屏幕宽度
宽度将始终按屏幕高度缩放。实际上,它将始终缩放到(视频视图)自己的高度。但正如我对代码的评论,使用layout\u height=“match\u parent”匹配屏幕
如果屏幕宽度更大,我不确定您是否希望宽度合适
如果屏幕宽度更大,视频宽度将无法填满屏幕。这个问题没有解决方案,它是6年前发布的。我们可能应该继续问我的问题。如果你有视频的分辨率,为什么不通过编程调整视频视图的尺寸呢。@IsraeldelaCruz视频的纵横比是16:9,而屏幕的纵横比是18.9:9。如果我使用fill_parent,则视频会出现拉伸。我想让视频填满屏幕,即使部分高度会被剪掉。谢谢你的详细回答。现在就开始。AR高度是多少?您还可以提供您的XML吗?除非我遗漏了什么,否则你的代码似乎没有什么不同。我手机的纵横比是19.5:9。我希望高度填充屏幕,但宽度不受屏幕限制(它可能会溢出)。AR是纵横比。我说得太快了。这确实达到了我想要的效果。只需确保父布局是FrameLayout。您可能还想在这里发布您的解决方案:,因为我相信还没有选择任何答案,而且没有一个对我有效。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--parent needs to be matching the screen height-->
<!--VideoView layout_width doesn't matter-->
<VideoView
android:id="@+id/video_player"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
// at onCreate or anywhere
// post, because view dimension is not initialized yet in here
videoView.post(new Runnable() {
@Override
public void run() {
// do resizing here
// AR = aspect ratio
float videoARWidth = 16.f;
float videoARHeight = 9.f;
// Phone screen aspect ratio height
float screenARHeight = 9.f;
// scale to screen AR height
float videoScale = screenARHeight / videoARHeight;
float videoARRatio = videoARWidth / videoARHeight;
// scale the ratio to screen
float videoScaledARRatio = videoARRatio * videoScale;
ViewGroup.LayoutParams layoutParams = videoView.getLayoutParams();
// make sure the VideoView matches the screen height
layoutParams.width = (int)(videoView.getHeight() * videoScaledARRatio);
videoView.setLayoutParams(layoutParams);
}
});