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. 效果图

视频播放 (三) 视频列表相关推荐

  1. html5实现视频列表js代码,JavaScript实现html5视频播放器列表

    本文将使用HTML5提供的 VideoAPI做一个自定义的视频列表播放器(重点放在视频的顺序播放,列表切换上,并不重新定义控制条). 一.插入视频 如果不加上controls属性将不会显示控制条 二. ...

  2. Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频

    Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...

  3. Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频

    Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 (本篇博客参考<Android第一行代码(第二版)>中关于RecyclerView的部分) 列表的实 ...

  4. 仿网易/QQ空间视频列表滚动连播炫酷效果

    代码地址如下: http://www.demodashi.com/demo/11201.html 一.准备工作 AndroidStudio 开发环境 需要下载七牛的开源播放器SDK 本例子实现了仿网易 ...

  5. 微信小程序 视频列表滑动无限循环(仿抖音)

    一.写在前面: 1:安卓ios表现基本一致,不是swiper组件实现,滑动效果流畅不卡顿,实现了列表无限循环.不是使用官方的腾讯视频播放组件,完整代码在下面 2:实现功能:支持位置导航.拨打电话.复制 ...

  6. 【Python】大数据挖掘课程作业1——使用爬虫爬取B站评论、弹幕与UP主的投稿视频列表

    [Python]大数据挖掘课程作业1--使用爬虫爬取B站评论.弹幕与UP主的投稿视频列表 数据挖掘部分的基本目标是:对于指定的UP主,能够获取其投稿视频列表:对于指定的视频,能够获取其视频标签.评论( ...

  7. 微信小程序 视频列表 封面图 禁止多个视频同时播放

    微信小程序视频列表用到的组件是  video 链接  https://developers.weixin.qq.com/miniprogram/dev/component/video.html 先附上 ...

  8. (仿头条App项目)9.视频列表页面实现

    文章目录 视频列表页面实现 效果图 相关布局 功能实现 引入第三方视频库插件 从服务端获取数据 显示 滚动播放功能实现 视频列表页面实现 效果图 相关布局 视频VideoFragment页面放一个Li ...

  9. m3u8文件在手机上用什么软件看_新技能Get!教你制作m3u8文件 创建属于自己的直播视频列表...

    得益于互联网的发展,网络视频平台成为如今观看视频的主要渠道,不管是电脑还是手机.甚至在智能电视中,我们更喜欢通过下载某平台的客户端进行观看.而这些平台虽然资源众多,但很少能看电视直播,就算能看,找起来 ...

最新文章

  1. 漫话:如何给女朋友解释什么是系统可用性?
  2. 爱奇艺称告别唯流量时代 正式关闭显示前台播放量
  3. 关于重装系统或还原系统
  4. Cocos2d-x 3.0正式版及android环境搭建
  5. python浮点数占多少字节_Python的浮点数损失精度问题
  6. matlab八节点六面体程序,平面8节点等参元完整程序
  7. android listview 优化,Android ListView、GridView等性能优化
  8. django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分
  9. python编程考试_《Python程序设计》试题库
  10. 优化Windows电脑常见方法,提高速度,释放硬盘C盘
  11. 吴恩达机器学习:偏差与方差、欠拟合与过拟合
  12. 手写Maven的archetype项目脚手架
  13. 【生活相关】实验室专题研讨PPT模板说明备忘
  14. BZOJ1196 [HNOI2006]公路修建问题 【二分 + Kruskal】
  15. 火山引擎多场景下的云原生技术实践
  16. otf是什么格式?怎么安装呢?
  17. [codeforces 1379B] Dubious Cyrpto 公式推导
  18. SRS 代码分析【HLS切片】
  19. 天津大学《计算机应用基础》在线
  20. 《缠中说禅108课》84:本 ID 理论一些必须注意的问题

热门文章

  1. 订餐网的商业模式之Opentable
  2. c语言 vc 记事本设计,c语言程序设计课程设计--记事本.doc
  3. 实现简单的带头双向循环链表
  4. Android Studio版本控制之SVN图文教程篇
  5. RoboMaster能量机关识别的简易实现
  6. r7 5700g对比5800x选哪个
  7. Houdini JoyOfVex 教程01
  8. 新生研讨课课后感ldy
  9. 带你浅浅了解自动驾驶激光雷达
  10. oracle性能优化的好书,Oracle性能优化绝版好书:高级OWI与ORACLE性能调整