基於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設定監聽:
videoView.setBackListener((view, isPortrait) -> {
if (isPortrait) {
//do something
}
return false;
});
如果返回值是 true
, 系統後續動作會被中斷.否則,ExoVideoView會自動處理方向,並且會回撥OrientationLister.onOrientationChange()
.
高階
1.多清清晰度
ExoVideoView 內建清晰度選擇器.如果開啟發多清晰度並新增了多清晰度,內建清晰度選擇器將被加入overlayFrameLayout
.
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"
相關文章
- 簡單使用exoplayer播放HLS
- ExoPlayer的使用與解析(官方文件翻譯)
- FFmpeg開發筆記(五十六)使用Media3的Exoplayer播放網路影片筆記
- 基於javaEE的看看Java
- 基於XML的DIXML
- 基於jQuery的AjaxjQuery
- 基於 ramfs 的 OTA
- 基於 SpringBoot 的 FileServiceSpring Boot
- 基於Heapster的HPA
- 基於graphql的微服務基礎框架微服務框架
- 基於相關畢業設計論文下載基於WEB,基於java基於JSPWebJavaJS
- 基於JSP的微博JS
- 基於Docker的GoldenGate部署DockerGo
- 基於mpvue的toast元件VueAST元件
- 基於C#的GRPCC#RPC
- 基於Python的效能分析Python
- 基於 Traefik 的 ForwardAuth 配置Forward
- 關於hive的基礎Hive
- 基於 KubeVela 的 GitOps 交付Git
- 基於Gitlab的CICD流程Gitlab
- ES 筆記十六:基於詞項和基於全文的搜尋筆記
- 基於 LNMP 的 Nginx 百萬併發之路 (三)基於域名的虛擬主機LNMPNginx
- 基於flask的最小的應用Flask
- 基於Gridsome建立一個基於Vue.JS和Markdown的部落格Vue.js
- MySQL基於GTIDs的MySQL ReplicationMySql
- 基於ObjectMapper的本地快取ObjectAPP快取
- 基於物件特徵的推薦物件特徵
- 基於jquery實現的ExceljQueryExcel
- 基於Maven的Spring整合CXFMavenSpring
- 基於python的集合運算Python
- 基於virtual dom 的canvas渲染Canvas
- 基於redis的分散式鎖Redis分散式
- 基於vue-ssr的探索Vue
- 基於netty的聊天室Netty
- 基於canvas的骨骼動畫Canvas動畫
- 基於Vue的Qabler元件庫Vue元件
- 基於報錯的注入模式模式
- 基於ChatGPT的智慧客服助手ChatGPT