https://exoplayer.dev/ui-components.html 这篇对我的帮助很大,感谢感谢
implementation 'com.google.android.exoplayer:exoplayer:2.x.x
自定义的控制按钮布局及添加了等待圈

 <com.google.android.exoplayer2.ui.PlayerViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent" /><ProgressBarandroid:id="@+id/prob"android:layout_width="30dp"android:layout_height="30dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent" />

最重要自定义进度条需要重写一个布局放在xml下,控制按钮Id名字保持一致即可。
exo_play
exo_pause
exo_position
exo_duration
exo_progress
exo_fullscreen_button

<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="212dp"><ImageViewandroid:id="@id/exo_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"tools:ignore="ContentDescription" /><ImageViewandroid:id="@id/exo_pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"tools:ignore="ContentDescription" /><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout_marginBottom="20dp"tools:ignore="MissingConstraints"><TextViewandroid:id="@+id/exo_position"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:layout_marginTop="10dp"android:layout_marginEnd="10dp"app:layout_constraintLeft_toLeftOf="parent" /><TextViewandroid:id="@+id/exo_duration"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:layout_marginTop="10dp"android:layout_marginEnd="10dp"app:layout_constraintRight_toRightOf="parent" /><!--补充放大功能图片,根据需求可省略-->  <ImageViewandroid:id="@+id/exo_fullscreen_button"android:layout_width="20dp"android:layout_height="20dp"android:layout_gravity="center"android:src="@drawable/main_home_video_play"app:layout_constraintRight_toRightOf="parent"tools:ignore="ContentDescription" /><com.google.android.exoplayer2.ui.DefaultTimeBarandroid:id="@id/exo_progress"android:layout_width="0dp"android:layout_height="20dp"android:layout_weight="1"app:buffered_color="@android:color/darker_gray"app:layout_constraintBottom_toBottomOf="@id/exo_position"app:layout_constraintLeft_toRightOf="@id/exo_position"app:layout_constraintRight_toLeftOf="@id/exo_duration"app:layout_constraintTop_toTopOf="@id/exo_position"app:played_color=""app:unplayed_color="" /></androidx.constraintlayout.widget.ConstraintLayout></FrameLayout>

写好布局之后,已经完成一半啦

        //全屏播放1.清单中加入权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><activity android:name=".ExoPlayerActivity" android:configChanges="orientation">2.imageButtonFullScreen  = findViewById(R.id.exo_fullscreen_button)imageButtonFullScreen.setOnClickListener {val flagsFullScreen: Int = WindowManager.LayoutParams.FLAG_FULLSCREENif (isFullScreen) {window.addFlags(flagsFullScreen) // 设置全屏//如果上面的不起作用,可以换成下面的。if (supportActionBar != null) supportActionBar!!.hide() //应用标题栏isFullScreen = false} else { //退出全屏val attrs: WindowManager.LayoutParams = window.attributesattrs.flags = attrs.flags and flagsFullScreen.inv()window.attributes = attrswindow.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)if (supportActionBar != null) supportActionBar!!.show() //应用标题栏isFullScreen = true}}////创建播放实例player = ExoPlayerFactory.newSimpleInstance(requireActivity())//播放实例赋值给UI。mVideoView?.player = player//数据源val dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(requireActivity(), ""))videoSource = ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(“视频地址”))player.prepare(videoSource)}}//缓存好自动播放player.playWhenReady = true//监听播放状态以及失败原因player.addListener(object : Player.EventListener {override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {when (playbackState) {ExoPlayer.STATE_ENDED -> {//播放器完成了播放}ExoPlayer.STATE_READY -> {mProb.visibility = View.GONE// 播放器可以立即从当前位置开始播放。//当点击暂停或者播放时都会调用此方法//当跳转进度时,进度加载完成后调用此方法}ExoPlayer.STATE_BUFFERING -> { //播放器无法立即从当前位置开始播放。这种状态通常需要加载更多数据时发生。mProb.visibility = View.VISIBLE}}}override fun onPlayerError(error: ExoPlaybackException?) {super.onPlayerError(error)showToast("播放异常")}})}override fun onPause() {super.onPause()player.setPlayWhenReady(false)}override fun onResume() {super.onResume()player.setPlayWhenReady(true)}override fun onDestroyView() {super.onDestroyView()instance = nullif (player != null) {player.stop()player.release()}}

ExoPlayer记录学习相关推荐

  1. 今天开始要详细的记录学习sharepoint 的进度和相关的一些资料

    今天开始要详细的记录学习sharepoint 的进度和相关的一些资料 转载于:https://www.cnblogs.com/chenfulai/archive/2007/07/26/831952.h ...

  2. 我的首篇博客——记录学习,不忘初心

    Hello,大家好!我是阿冰!今天是2022年12月2日,受疫情影响,我们学校的同学都早早的回家了,今天就是我回家的第五天.其实,这并不算是真正意义的寒假,因为过两天我们还有将近一个月的实训,大约到1 ...

  3. 华为平板c语言编译器,平板成为学习神器?举手秒变C位,低头记录学习,学霸一点都不难~...

    原标题:平板成为学习神器?举手秒变C位,低头记录学习,学霸一点都不难~ 著名教育家陶行知先生曾说过"培育能力的事必须继续不断地去做,又必须随时改善学习方法,提高学习效率,才会成功." ...

  4. android 传感器 鼠标,记录学习第一天------android多线程的开发和传感器的初步认识...

    记录学习的第一天. 今天花了很多时间把android 最近上课的内容补完了. 1)运用android 多线程编程开发一个运动小球的游戏. 游戏内容如下:1.使用按钮控制游戏开始和结束: 2.用户自己设 ...

  5. 记录学习Mockito单元测试的坑——空指针异常

    记录学习Mockito单元测试的坑--空指针异常 情况一 mockito-all依赖和mockito-core依赖同时引用时,可能会报空指针异常 正确引用 <!--导入junit单元测试依赖-- ...

  6. 记录学习WeakReference发现的问题

    在学习ThreadLocal时发现ThreadLocalMap里的Entry使用到了WeakReference,所以重新学习WeakReference 查看相关博客例如: https://blog.c ...

  7. 记录学习 - spring5

    1.Spring概述 1.1 简介 Spring : 春天 ->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月 ...

  8. [记录学习]自学动力节点荣姐SpringMVC5笔记

    首先感谢动力节点和老师的教学分享!Respect! 学习视频来源: B站: https://www.bilibili.com/video/BV1oP4y1K7QT/?spm_id_from=333.1 ...

  9. 记录学习《流畅的python》的一些知识-----对象引用,可变性和垃圾回收

    记录我学习<流畅的python>的过程--对象引用,可变性和垃圾回收 2021.9.22 1.变量不是盒子 2.标识.相等性和别名 3.默认做浅复制 4.函数的参数作为引用时 5.del和 ...

最新文章

  1. java 头尾 队列_记一次腾讯面试,我挂在了最熟悉不过的队列上
  2. Enhanced-RCNN: 一种高效的比较句子相似性的方法 |​WWW 2020
  3. 英语阅读计算机病毒是指,2016年职称计算机考试真题及答案
  4. python编程入门单例_python实现单例模式怎么写啊?
  5. matlab图像信息熵交叉熵,【机器学习】信息量,信息熵,交叉熵,KL散度和互信息(信息增益)...
  6. android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点
  7. 设置 mock_Quasar 使用 Mock.js
  8. 难住了N个面试者,http协议无状态中的 状态 到底指的是什么?!
  9. 创建 JavaScript 对象
  10. lopatkin俄大神精简Windows 10 Pro 19042.487 20H2 PreRelease x86-x64 ZH-CN BIZ(2020-09-01)
  11. Visio2019中插入数学公式
  12. Java开发常用技术栈
  13. 索尼电视android9,索尼电视系统更新通知:解决升级到安卓9.0版本后bug问题
  14. python 爬取贝壳网小区名称_利用python爬取贝壳网租房信息,python爬虫接单网, 最近准备换房子,...
  15. 南方cass简码识别大全_cass-简码识别详细分解.doc
  16. 成都开发者看过来!百度资深研发工程师将出席超级账本成都见面会
  17. 【向生活低头】wps行间距问题
  18. 如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
  19. 什么是集合?集合的相关知识
  20. iOS开发笔记之二十四——Xcode下类中供外部调用的方法添加注释说明技巧

热门文章

  1. Unity 3D游戏-见缝插针源码
  2. 4-40UNC-2B
  3. java正则表达式 find_java正则表达式find
  4. 大厂SQL面试题,连续时间问题
  5. 事件营销说到底就是抓住热点事件做营销
  6. 暑期项目实训:基于webgl(three.js)的牙科数据可视化展示
  7. 武士风度的牛[CH2906]
  8. ADB入门(四)-连接异常处理篇
  9. 技能高考模拟试题三计算机类,计算机技能高考2016模拟试卷3
  10. 数据库第十一次作业--视图的应用