#视频播放模式是竖屏,如果视频是9:16就铺满全屏,如下图。
#如果是16:9的话,让它在中间播放,不铺满全屏,保持不变。
要实现类似抖音的全屏视频播放效果,您可以按照以下步骤进行操作:
1,使用 ViewPager2 控件:ViewPager2 是用于替代 ViewPager 的新一代控件,支持垂直滚动和修改的 Fragment 集合等特性。您可以在您的 Android 项目中添加 ViewPager2 的依赖,并在布局文件中添加 ViewPager2 控件。
2,创建适配器:为 ViewPager2 创建一个适配器,用于加载和管理视频视图。适配器可以继承自 RecyclerView.Adapter,并根据需要自定义视图的布局和内容。
3,实现视频播放控制:在视频视图中,您可以使用 VideoView 控件来实现视频播放功能。VideoView 是 Android 提供的用于播放本地和网络视频的视图组件。您可以在视频视图中添加播放按钮、进度条等控件,并通过监听器来控制视频的播放、暂停和进度跟踪。您还可以使用 RecyclerView 和 PageSnapHelper 来实现抖音式的滑动切换效果。
4,添加封面图和状态管理:在视频加载成功之前,您可以显示一个封面图来提供良好的用户体验。同时,可以创建一个状态枚举类来管理视频的状态,例如加载完成、播放中、播放结束、错误等。
5,实时更新进度条:使用 Handler 来定时更新进度条和已播放时间,以便用户可以实时了解视频的播放进度。
这些步骤提供了一个基本的框架,您可以根据自己的需求进行进一步的定制和优化。可以参考以下文章:
https://zhuanlan.zhihu.com/p/341660941
https://blog.csdn.net/fukaimei/article/details/113736724
https://blog.csdn.net/u011272795/article/details/103276744
1.创建一个包含视频播放器的布局:在您的布局文件中,添加一个SurfaceView或TextureView来显示视频内容。这将作为您的视频播放器的界面。
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
初始化视频播放器:在您的活动(Activity)或片段(Fragment)中,初始化视频播放器。您可以使用Android提供的MediaPlayer类或第三方库(如ExoPlayer)来实现 SurfaceView surfaceView = findViewById(R.id.surface_view); MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDisplay(surfaceView.getHolder()); 设置视频源:使用setDataSource()方法将视频文件或视频URL设置为视频播放器的数据源。 mediaPlayer.setDataSource(videoPath); // 或 mediaPlayer.setDataSource(videoUrl); 准备和播放视频:在设置完数据源后,调用prepare()方法准备视频播放器,并在准备完成后调用start()方法开始播放视频。 准备和播放视频:在设置完数据源后,调用prepare()方法准备视频播放器,并在准备完成后调用start()方法开始播放视频。 mediaPlayer.prepare(); mediaPlayer.start(); 进行全屏切换:为了实现全屏播放,您需要调整活动或片段的布局参数,以铺满整个屏幕。您可以在全屏切换时,修改布局参数,或者创建一个全屏的活动或片段。 // 设置全屏标志 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 隐藏导航栏(可选)
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
这些步骤可以帮助您实现在Android应用中模仿抖音的视频播放,并将其铺满全屏。请记住,在实际应用中,您可能还需要处理视频播放控制、全屏切换时的布局调整等其他细节。
要将视频播放器铺满全屏,在Android中,可以使用以下步骤实现:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
VideoView videoView = findViewById(R.id.videoView);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT
);
// 确保视频填充整个屏幕
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
videoView.setLayoutParams(layoutParams);
int videoWidth = videoView.getMeasuredWidth();
int videoHeight = videoView.getMeasuredHeight();
if (videoWidth > videoHeight) {
// 横向视频
float aspectRatio = (float) videoHeight / videoWidth;
if (aspectRatio <= 0.56f) { // 判断9:16(0.56)相对于16:9(0.5625)更接近
// 缩放视频宽度,保持高度不变
int newWidth = (int) (videoHeight / 0.56f);
int marginHorizontal = (videoWidth - newWidth) / 2;
layoutParams.width = newWidth;
layoutParams.setMargins(marginHorizontal, 0, marginHorizontal, 0);
}
} else {
// 纵向视频,铺满全屏
}
以上代码可以根据视频的宽高比来决定是否铺满全屏。如果是竖向视频(宽度小于高度),会判断其高宽比是否接近9:16。如果接近,则缩放视频的宽度并水平居中显示,保持高度不变。
不知道你这个问题是否已经解决, 如果还没有解决的话:以下答案参考newbing,回答由博主波罗歌编写:
要实现在Android中将视频播放器铺满全屏的效果,您可以按照以下步骤进行操作:
VideoView
控件放置在一个父容器中,例如一个FrameLayout
。 android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在您的Activity中,获取到VideoView
实例,并设置视频的URI:
VideoView videoView = findViewById(R.id.video_view);
Uri videoUri = Uri.parse("your_video_url_here");
videoView.setVideoURI(videoUri);
接下来,我们需要根据视频的宽高比例来调整VideoView
的尺寸。如果视频的宽高比例为9:16,我们要将其铺满全屏;如果是16:9,我们将其居中显示。
FrameLayout videoFrame = findViewById(R.id.video_frame);
float videoAspectRatio = 9f / 16f; // 视频的宽高比例
float screenWidth = getResources().getDisplayMetrics().widthPixels;
float screenHeight = getResources().getDisplayMetrics().heightPixels;
float screenAspectRatio = screenWidth / screenHeight; // 设备屏幕的宽高比例
if (videoAspectRatio > screenAspectRatio) {
// 视频宽高比例大于屏幕宽高比例,需要将视频铺满全屏
videoFrame.setPadding(0, Math.round((screenHeight - screenWidth / videoAspectRatio) / 2), 0, 0);
} else {
// 视频宽高比例小于等于屏幕宽高比例,将其居中显示
videoFrame.setPadding(Math.round((screenWidth - screenHeight * videoAspectRatio) / 2), 0, 0, 0);
}
以上代码根据视频宽高比例与屏幕宽高比例的大小关系来设置父容器的内边距,以实现全屏或居中显示的效果。
videoView.start();
这样,您就可以在Android中实现将视频播放器铺满全屏的效果了。请将"your_video_url_here"替换为实际的视频URL,并确保您的项目中已经添加了所需的权限,例如INTERNET
和READ_EXTERNAL_STORAGE
等。
希望对您有帮助!
如果我的回答解决了您的问题,请采纳!
研究了 一天,感谢各位大佬提供的解决方案,但是都没有解决问题。根据我今天摸索,最终使用获取视频第一帧获取视频宽高,再判断视频是否需要铺满全屏播放。
mvideo.setVisibility(View.VISIBLE);
//视频地址
mvideo.setVideoURI(Uri.parse(videoUrl));
//获取文件信息
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
//视频数据源
mediaMetadataRetriever.setDataSource(videoUrl);
//获取从-1秒后最近位置的关键帧,其实就是第一帧数据。
Bitmap frameAtTime = mediaMetadataRetriever.getFrameAtTime(-1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT
);
//这里设置600不够严谨,不过我看了好多某音16:9的视频基本高度都是600以下。
if (frameAtTime.getHeight() > 600) {
// 确保视频填充整个屏幕
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mvideo.setLayoutParams(layoutParams);
} else {
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
//layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
//layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
//layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
//layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
mvideo.setLayoutParams(layoutParams);
}
mvideo.start();