视频播放 (三) 视频列表
1. 配置信息
1.1 AndroidManifest.xml 添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
1.2 使用 Http 明文设置
android:usesCleartextTraffic="true"
1.3 使用竖屏设置
android:screenOrientation="portrait"
1.4 使用协程引用库
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha03'
1.5 themes.xml 文件设置无操作栏, 全屏
Theme.MaterialComponents.DayNight.NoActionBar<item name="android:windowFullscreen">true</item>
1.6 功能说明
使用ViewPager2的嵌套实现左右、上下滑动的列表视频播放
2. 实现 Fool 页面
2.1 布局文件 fragment_foo.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=".FooFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="@string/hello_blank_fragment"android:textSize="24sp" />
</FrameLayout>
2.2 调用布局 FooFragment.kt
class FooFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_foo, container, false)}
}
3. Player 视频播放View
3.1 布局文件 fragment_player.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=".PlayerFragment"><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /><ProgressBarandroid:id="@+id/progressBar"style="?android:attr/progressBarStyle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /><ProgressBarandroid:id="@+id/progressBarHor"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom" />
</FrameLayout>
3.2 实现播放器 PlayerFragment.kt
class PlayerFragment(private val url:String) : Fragment() {private var mediaPlayer = MediaPlayer()override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_player, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val progressBar: ProgressBar = view.findViewById(R.id.progressBar)val progressBarHor: ProgressBar = view.findViewById(R.id.progressBarHor)val surfaceView: SurfaceView = view.findViewById(R.id.surfaceView)mediaPlayer.apply {setOnPreparedListener {progressBarHor.max = mediaPlayer.duration//it.start();seekTo(1)progressBar.visibility = View.INVISIBLE}setDataSource(url)prepareAsync()progressBar.visibility = View.VISIBLE}//kutlifecycleScope.launch {while (true){progressBarHor.progress = mediaPlayer.currentPositiondelay(500)}}surfaceView.holder.addCallback(object : SurfaceHolder.Callback{override fun surfaceCreated(holder: SurfaceHolder) {}override fun surfaceChanged(holder: SurfaceHolder,format: Int,width: Int,height: Int) {mediaPlayer.setDisplay(holder)//屏幕不关闭mediaPlayer.setScreenOnWhilePlaying(true)}override fun surfaceDestroyed(holder: SurfaceHolder) {}})}override fun onResume() {super.onResume()mediaPlayer.start()lifecycleScope.launch {while (!mediaPlayer.isPlaying){mediaPlayer.start()delay(500)}}}override fun onPause() {super.onPause()mediaPlayer.pause()}
}
4. 播放列表
4.1 布局文件 fragment_video.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=".VideoFragment"><androidx.viewpager2.widget.ViewPager2android:id="@+id/videoViewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" />
</FrameLayout>
4.2 调用布局实现 VideoFragment.kt
private val videoUrls: List<String> = listOf("https://v-cdn.zjol.com.cn/280443.mp4","https://v-cdn.zjol.com.cn/276982.mp4","https://v-cdn.zjol.com.cn/276984.mp4","https://v-cdn.zjol.com.cn/276985.mp4","https://v-cdn.zjol.com.cn/276986.mp4","https://v-cdn.zjol.com.cn/276987.mp4","https://v-cdn.zjol.com.cn/276988.mp4","https://v-cdn.zjol.com.cn/276989.mp4","https://v-cdn.zjol.com.cn/276990.mp4","https://v-cdn.zjol.com.cn/276991.mp4","https://v-cdn.zjol.com.cn/276992.mp4","https://v-cdn.zjol.com.cn/276993.mp4","https://v-cdn.zjol.com.cn/276994.mp4","https://v-cdn.zjol.com.cn/276996.mp4","https://v-cdn.zjol.com.cn/276998.mp4","https://v-cdn.zjol.com.cn/277000.mp4","https://v-cdn.zjol.com.cn/277001.mp4","https://v-cdn.zjol.com.cn/277002.mp4","https://v-cdn.zjol.com.cn/277003.mp4","https://v-cdn.zjol.com.cn/277004.mp4"
)class VideoFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.fragment_video, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val videoViewPager: ViewPager2 = view.findViewById(R.id.videoViewPager)videoViewPager.apply {adapter = object : FragmentStateAdapter(this@VideoFragment) {override fun getItemCount() = videoUrls.sizeoverride fun createFragment(position: Int) = PlayerFragment(videoUrls[position])}setCurrentItem(0, false)// offscreenPageLimit = 5}}
}
5. 主页实现
5.1 布局文件, activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><androidx.viewpager2.widget.ViewPager2android:id="@+id/mainViewPager"android:layout_width="match_parent"android:layout_height="match_parent" /><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="200dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"android:background="#00FFFFFF"app:tabIndicatorFullWidth="false" />
</FrameLayout>
5.2 实现 VideoFragment 的调用, MainActivity.kt
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val tabLayout: TabLayout = findViewById(R.id.tabLayout)val mainViewPackage2: ViewPager2 = findViewById(R.id.mainViewPager)mainViewPackage2.apply {adapter = object : FragmentStateAdapter(this@MainActivity) {override fun getItemCount() = 3override fun createFragment(position: Int) = when (position) {1 -> VideoFragment()else -> FooFragment()}}setCurrentItem(1, false)}TabLayoutMediator(tabLayout, mainViewPackage2) { tab: TabLayout.Tab, i: Int ->tab.text = when (i) {1 -> "video"else -> "foo"}}.attach()}
}
6. 效果图
视频播放 (三) 视频列表相关推荐
- html5实现视频列表js代码,JavaScript实现html5视频播放器列表
本文将使用HTML5提供的 VideoAPI做一个自定义的视频列表播放器(重点放在视频的顺序播放,列表切换上,并不重新定义控制条). 一.插入视频 如果不加上controls属性将不会显示控制条 二. ...
- Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频
Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...
- Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频
Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 (本篇博客参考<Android第一行代码(第二版)>中关于RecyclerView的部分) 列表的实 ...
- 仿网易/QQ空间视频列表滚动连播炫酷效果
代码地址如下: http://www.demodashi.com/demo/11201.html 一.准备工作 AndroidStudio 开发环境 需要下载七牛的开源播放器SDK 本例子实现了仿网易 ...
- 微信小程序 视频列表滑动无限循环(仿抖音)
一.写在前面: 1:安卓ios表现基本一致,不是swiper组件实现,滑动效果流畅不卡顿,实现了列表无限循环.不是使用官方的腾讯视频播放组件,完整代码在下面 2:实现功能:支持位置导航.拨打电话.复制 ...
- 【Python】大数据挖掘课程作业1——使用爬虫爬取B站评论、弹幕与UP主的投稿视频列表
[Python]大数据挖掘课程作业1--使用爬虫爬取B站评论.弹幕与UP主的投稿视频列表 数据挖掘部分的基本目标是:对于指定的UP主,能够获取其投稿视频列表:对于指定的视频,能够获取其视频标签.评论( ...
- 微信小程序 视频列表 封面图 禁止多个视频同时播放
微信小程序视频列表用到的组件是 video 链接 https://developers.weixin.qq.com/miniprogram/dev/component/video.html 先附上 ...
- (仿头条App项目)9.视频列表页面实现
文章目录 视频列表页面实现 效果图 相关布局 功能实现 引入第三方视频库插件 从服务端获取数据 显示 滚动播放功能实现 视频列表页面实现 效果图 相关布局 视频VideoFragment页面放一个Li ...
- m3u8文件在手机上用什么软件看_新技能Get!教你制作m3u8文件 创建属于自己的直播视频列表...
得益于互联网的发展,网络视频平台成为如今观看视频的主要渠道,不管是电脑还是手机.甚至在智能电视中,我们更喜欢通过下载某平台的客户端进行观看.而这些平台虽然资源众多,但很少能看电视直播,就算能看,找起来 ...
最新文章
- 漫话:如何给女朋友解释什么是系统可用性?
- 爱奇艺称告别唯流量时代 正式关闭显示前台播放量
- 关于重装系统或还原系统
- Cocos2d-x 3.0正式版及android环境搭建
- python浮点数占多少字节_Python的浮点数损失精度问题
- matlab八节点六面体程序,平面8节点等参元完整程序
- android listview 优化,Android ListView、GridView等性能优化
- django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分
- python编程考试_《Python程序设计》试题库
- 优化Windows电脑常见方法,提高速度,释放硬盘C盘
- 吴恩达机器学习:偏差与方差、欠拟合与过拟合
- 手写Maven的archetype项目脚手架
- 【生活相关】实验室专题研讨PPT模板说明备忘
- BZOJ1196 [HNOI2006]公路修建问题 【二分 + Kruskal】
- 火山引擎多场景下的云原生技术实践
- otf是什么格式?怎么安装呢?
- [codeforces 1379B] Dubious Cyrpto 公式推导
- SRS 代码分析【HLS切片】
- 天津大学《计算机应用基础》在线
- 《缠中说禅108课》84:本 ID 理论一些必须注意的问题