基于ExoPlayer的ExoVideoView

###前言

本人之前写过一篇名为基于ExoPlayer的ExoPlayerVideoView的文章,近日发现竟然被盗用了。

今日再次发布本文是因为ExoVideoView升级啦,新版的更好用,支持更多功能,支持自定义controller。

特性

1.自动处理音频焦点。
2.根据传感器自动处理方向。
3.手势支持。
4.多清晰度选择支持。
5.为控制器添加自定义布局.
6.调整显示大小。
7.自定义controller。

使用 ExoVideoView

1.依赖

最简单的方式是加入gradle依赖。请确认在工程的build.gradle中添加了JCenter和google()。

repositories {
    jcenter()
    google()
}

然后在你的项目中添加如下代码:

implementation 'com.jarvanmo:exoplayerview:2.0.8'

2.在xml中定义

在xml中使用 ExoVideoView:

<com.jarvanmo.exoplayerview.ui.ExoVideoView
     android:id="@+id/videoView"
     android:layout_width="match_parent"
     android:layout_height="300dp"/>

3.在java代码中

ExoVideoView 提供了内建Player

SimpleMediaSource mediaSource = new SimpleMediaSource(url);//也支持uri
videoView.play(mediaSource);
videoView.play(mediaSource,where);//play from a particular position

也可以使用自义的Player:

videoView.setPlayer(player);

提示:不要忘记释放ExoPlayer:

videoView.releasePlayer();

详情请移步demo.

3.方向管理

ExoVideoView 可以自动处理方向问题,前提是为ExoVideoView设置一个OrientationListener:

    videoView.setOrientationListener(orientation -> {
            if (orientation == SENSOR_PORTRAIT) {
                //do something
            } else if (orientation == SENSOR_LANDSCAPE) {
                //do something
            }
        });

提示:当ExoVideoView自动处理方向问题时,如果在Controller中的context是Activity,那么系统会调用

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) or activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 全屏事件处理也是如此。4返回管理首先,重写onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        return videoView.onKeyDown(keyCode, event);
    }
    return super.onKeyDown(keyCode, event);
}
为ExoVideoView设置监听:
```java
videoView.setBackListener((view, isPortrait) -> {
        if (isPortrait) {
          //do something
        }
        return false;
    });
如果返回值是 ```true```, 系统后续动作会被中断.否则,ExoVideoView会自动处理方向,并且会回调```OrientationLister.onOrientationChange()``` .
## 高级
### 1.多清清晰度
ExoVideoView 内置清晰度选择器.如果开启发多清晰度并添加了多清晰度,内置清晰度选择器将被加入```overlayFrameLayout```.
```java
    List<ExoMediaSource.Quality> qualities = new ArrayList<>();
    ExoMediaSource.Quality quality =new SimpleQuality(quality,mediaSource.url());
    qualities.add(quality);
    mediaSource.setQualities(qualities);
### 2.Controller显示模式
```ExoVideoPlaybackController``` 被分为四个部分:
1.Top
2.Top Landscape
3.Bottom
4.Bottom Landscape

每一部分都可以被显示或隐藏:

 app:controller_display_mode="all|none|top|top_landscape|bottom|bottom_landscape"

在java中:

  videoView.setControllerDisplayMode(mode);

3.为controller添加控件

ExoVideoPlaybackController 允许在java代码中添加控件.

videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP, view);

videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP_LANDSCAPE, view);

videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_BOTTOM_LANDSCAPE, view);

### 4.使用自定义controller布局
```exo_video_playback_control_view.xml```是允许自定义的。其中一些属性在```ExoVideoPlaybackControlView```有定义。具体可看源码。
app:controller_layout_id="@layout/my_controller"

其他

  app:controller_background="@android:color/holo_orange_dark"
  app:use_artwork="true"
  app:default_artwork="@drawable/default_art"

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=19tbyocergjaa

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩东吉的Unity杂货铺

零基础入门 4: 窗口介绍(完)

上一篇将Unity里几个比较重要的窗口先进行了讲解,以及如何自定义窗口布局,不知道大家都消化的怎么样,今天这篇窗口介绍,将把剩余window的窗口一一进行介绍。

17410
来自专栏世界第一语言是java

vue2(webpack)调用amap高德地图及其UI组件vue2(webpack)调用amap高德地图及其UI组件和标记物#

31730
来自专栏梁源的专栏

基于 vue-cli + webpack 开发实践:《体育视频播放页》

《体育视频播放页》基于vue-cli+webpack开发,此次开发总结,将会总结开发过程中涉及到的知识点以及开发技巧,希望能帮助到想要在工作中使用Vue.js开...

1.1K40
来自专栏谦谦君子修罗刀

项目开发解决方案及参考文献

玩转 iOS 10 推送 —— UserNotifications Framework(上) iOS 接收推送消息后跳转到某个页面(适配iOS10)

21210
来自专栏PPV课数据科学社区

【学习】15款经典图表软件推荐 创建最漂亮的图表

以下列出的图表,图形和数据可视化的最佳软件,从创建基本的2D图表到产生复杂的数据集的数据可视化,这些PHP,Javascript、Flash的图表,对于任何一个...

35730
来自专栏九彩拼盘的叨叨叨

HTML相关的面试题

在浏览器中有三种渲染模式: 怪癖模式(quirks mode),准标准模式(almost standards mode)和标准模式(standards mode...

10630
来自专栏DeveWork

CSS 命名之Dialog, Modal, Popup, Popover, Lightbox 等的区别

写 CSS 时候经常遇到要为弹窗浮层这些进行 class 命名的情况,之前对于Dialog, Modal, Popup, Flash,Tooltip等这类命名一...

40160
来自专栏web编程技术分享

【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)

40080
来自专栏IMWeb前端团队

React-Redux 源码解析系列 -- React-Redux的作用

前面的章节讲完了redux的部分,又已经有了react,那为什么还需要有React-Redux呢?这个React-Redux 又帮助我们做了什么呢? conte...

229100
来自专栏ionic3+

【风雨欲来的Hybird】(2)Stencil——万物皆组件,与框架无关

Stencil也不是一个新东西,出来快有10个月了,它中文意思是“模版”,是一个Web组件的编译器,它采用微小的虚拟DOM层、有效的单向数据绑定、异步渲染管道(...

16520

扫码关注云+社区

领取腾讯云代金券