ExoVideoView is based on ExoPlayer .
中文移步至此 .
1.Process AudioFocus automatically. 2.Process its orientation by sensor automatically 3.simple gesture action supported. 4.multiple video quality supported 5.you can add custom views to the default controller. 6.multiple resize-mode supported 7.custom controller supported.
The easiest way to get started using ExoVideoView is to add it as a gradle dependency. You need to make sure you have the JCenter and Google repositories included in the build.gradle file in the root of your project:
repositories { jcenter() google() }
Next add a gradle compile dependency to the build.gradle file of your app module:
implementation 'com.jarvanmo:exoplayerview:2.0.1'
Declare ExoVideoView in your layout file as :
<com.jarvanmo.exoplayerview.ui.ExoVideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="300dp"/>
ExoVideoView provides built-in Player
for convenience,so we can play a video as
SimpleMediaSource mediaSource = new SimpleMediaSource(url); videoView.play(mediaSource); videoView.play(mediaSource,where);//play from a particular position
Passing a player outside to ExoVideoView:
videoView.setPlayer(player);
Note:never forget to release ExoPlayer:
videoView.releasePlayer();
see details in demo .
The ExoVideoView can handle its orientation by sensor automatically only when ExoVideoVIew has a not-null OrientationListener :
videoView.setOrientationListener(orientation -> { if (orientation == SENSOR_PORTRAIT) { //do something } else if (orientation == SENSOR_LANDSCAPE) { //do something } });
Note:When the ExoVideoView handle its orientation automatically,The ExoVideoView will call activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)
or activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
if the context
in controller is an Activity. The fullscreen management is the same as orientation management.
First,override onKeyDown:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return videoView.onKeyDown(keyCode, event); } return super.onKeyDown(keyCode, event); }
Then passing a backListener to ExoVideoView:
videoView.setBackListener((view, isPortrait) -> { if (isPortrait) { //do something } return false; });
If return value is true
, operation will be interrupted.Otherwise,ExoVideoView handle its orientation by itself and OrientationLister.onOrientationChange()
will be caled.
ExoVideoView also provides a built-in multi-quality selector.The multi-quality selector will be added to overlayFrameLayout
if multi-quality is enabled and ExoMediaSource
are given different qualities in current version.
List<ExoMediaSource.Quality> qualities = new ArrayList<>(); ExoMediaSource.Quality quality =new SimpleQuality(quality,mediaSource.url()); qualities.add(quality); mediaSource.setQualities(qualities);
ExoVideoPlaybackController
are divided into four parts:
1.Top 2.Top Landscape 3.Bottom 4.Bottom Landscape
Each of them can be hidden or shown:
app:controller_display_mode="all|none|top|top_landscape|bottom|bottom_landscape"
in java:
videoView.setControllerDisplayMode(mode);
Views can be added to ExoVideoPlaybackController
in java.
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP, view); videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP_LANDSCAPE, view); videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_BOTTOM_LANDSCAPE, view);
Defining your own exo_video_playback_control_view.xml
is useful to customize the layout of ExoVideoPlaybackControlView
throughout your application. It's also possible to customize the layout for asingle instance in a layout file. This is achieved by setting the controller_layout_id attribute on a ExoVideoPlaybackControlView
. This will cause the specified layout to be inflated instead of code exo_video_playback_control_view.xml
for only the instance on which the attribute is set.
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"