Exo 使用自定义UI
这部分看了网上一些文章,说的都很含糊,而且都是抄袭的。
总结下最近使用的感受和经验。
UI components
官网demo说的已经很详细,但是很多细节google都没处理,很多也没处理好。如果不是为了字幕的加载,和需求特殊,我可能不会选择exo单独使用。
gradle 依赖
implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'
重要的组件,StyledPlayerControlView, StyledPlayerView, PlayerControlView and PlayerView.
样式化的变体提供了很全,但是更难定制。
StyledPlayerControlView and PlayerControlView
是用于控制回放的视图。它们显示标准播放控件,包括播放/暂停按钮、快进和快退按钮以及搜索栏。
PlayerControlView and PlayerView.
它们在播放过程中显示视频、字幕和专辑艺术,以及分别使用StyledPlayerControl视图或PlayerControl视图的播放控件。
Player views
根据官网介绍
<com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
xml 里面这么生命使用基本demo就可以。但是如果自定义定制修改,需要重写StyledPlayerView,或者PlayerView .挺让人头大,可能不是架构功能,所以Google写的很死
Player control views
官网xml
<com.google.android.exoplayer2.ui.StyledPlayerControlView
android:id="@+id/player_control_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
很明显。Sample例子:StyledPlayerView 和 StyledPlayerControlView 是配套使用。PlayerView 和 PlayerControlView 配套
Customization
自定义,最让人心烦,也是很苦恼的问题,功能很全但是改UI就很苦恼。我主要看重他的字幕功能。
如果想定制drawable和layout还是有很多坑的。(就像接入融云等一些聊天的UI)
官网修改UI简单做法
在自己项目中写一个一样名字的xml, exo_player_control_view.xml
如:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton android:id="@id/exo_play"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="#CC000000"
style="@style/ExoMediaButton.Play"/>
<ImageButton android:id="@id/exo_pause"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="#CC000000"
style="@style/ExoMediaButton.Pause"/>
</FrameLayout>
或者
覆盖布局文件是在整个应用程序中更改布局的最佳解决方案,但如果只在单个位置需要自定义布局,该怎么办?要实现这一点,首先定义一个布局文件,就像覆盖一个默认布局一样,但这次给它一个不同的文件名,例如custom_controls.xml。其次,使用一个属性指示在膨胀视图时应使用此布局。例如,在使用PlayerView时,可以使用controller_layout_id属性指定用于提供播放控件的布局
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:controller_layout_id="@layout/custom_controls"/>
这样也只能修改简单的按钮,和他预定义定死的按钮。
吐槽
-
Google定死了id,你必须按照他的来,否则就像我一样全部重写,或者部分重写
定制需要吧values.xml, 拿出来放到自己的项目。styles.xml 也是覆写 -
PlayerView相关就把代码粘贴出来改。
-
关于控制,你必须通读UI相关源代码。而且全屏和旋转都需要自己控制。
-
设计师,必须有播放器和技术相关经验,不然程序累死找bug定制UI
-
不建议用,特殊情况可以,根据需求定制吧。
-
解耦太难。