21

** 如果您什么都不知道,我真的需要帮助,不要给我负面的评价:| 如果有什么困扰你的评论**

我想在 Exoplayer 中为我的播放器编写自定义 UI(更改暂停播放按钮或添加新按钮,例如下一个播放器速度等)。

我使用来自 github 的 Exoplayer 示例,在将代码添加到我的原始项目之前,我想在官方示例上测试自定义 UI。

我在 Stackoverflow 和 tuts+ 中阅读了有关自定义 UI 的页面,但我真的很困惑!

为什么要更改某些按钮的图像或更改它们的位置一定如此困难:) 我该如何处理?

编辑

这是示例 https://github.com/google/ExoPlayer/tree/master/demo

我读了这两篇文章:

http://www.brightec.co.uk/ideas/custom-android-media-controller

http://code.tutsplus.com/tutorials/create-a-music-player-on-android-user-controls--mobile-22787

根据此链接“您可以从 Android 中包含的 MediaController 类开始,而不是从头开始编写自己的媒体控制器”,我问这个问题是因为我无法在 exoplayer 库上执行此步骤,并且教程是默认编写的媒体播放器

4

3 回答 3

34

自定义 ExoPlayer 的 UI 非常简单。如果您查看 ExoPlayer 源代码,布局 res 目录包含exo_player_control_view.xml指向(包含)另一个布局的文件 - exo_playback_control_view.

  1. 复制布局资源的内容 -exo_playback_control_view.xml
  2. 使用您选择的任何名称创建布局资源文件 - 例如:custom_exo_playback_control_view.xml. 将复制的内容粘贴到新的 xml
  3. 根据需要对 UI 小部件进行任何更改。不要更改任何小部件/控件的 Id 属性。
  4. 将自定义 exoPlayer UI 资源指向包含PlayerView.

这是custom_exo_controller_view我从原始文件创建的 xml。我想要播放器控件的不同背景颜色以及不同的按钮和进度视图颜色:

<LinearLayout 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="wrap_content"
    android:layout_gravity="bottom"
    android:background="@drawable/attachment_document_desc_bg"
    android:layoutDirection="ltr"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingEnd="20dp"
    tools:targetApi="28">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:orientation="horizontal"
      android:paddingTop="4dp">

    <ImageButton
        android:id="@id/exo_prev"
        style="@style/ExoMediaButton.Previous"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_rew"
        style="@style/ExoMediaButton.Rewind"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_shuffle"
        style="@style/ExoMediaButton.Shuffle"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_repeat_toggle"
        style="@style/ExoMediaButton"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_play"
        style="@style/ExoMediaButton.Play"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_pause"
        style="@style/ExoMediaButton.Pause"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_ffwd"
        style="@style/ExoMediaButton.FastForward"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_next"
        style="@style/ExoMediaButton.Next"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

    <ImageButton
        android:id="@id/exo_vr"
        style="@style/ExoMediaButton.VR"
        android:tint="@color/colorPrimaryDark"
        android:tintMode="src_in" />

  </LinearLayout>

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="4dp"
      android:gravity="center_vertical"
      android:orientation="horizontal">

    <TextView
        android:id="@id/exo_position"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:includeFontPadding="false"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:textColor="#ff323232"
        android:textSize="14sp"
        android:textStyle="bold" />

    <com.google.android.exoplayer2.ui.DefaultTimeBar
        android:id="@id/exo_progress"
        android:layout_width="0dp"
        android:layout_height="26dp"
        android:layout_weight="1"
        app:played_color="@color/colorPrimaryDark"
        app:unplayed_color="@color/gray" />

    <TextView
        android:id="@id/exo_duration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:includeFontPadding="false"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:textColor="#ff323232"
        android:textSize="14sp"
        android:textStyle="bold" />

  </LinearLayout>

</LinearLayout>

下面是我用于播放器的代码。注意,xml 属性app:controller_layout_id指向上面定义的自定义控制器视图。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp">

  <com.google.android.exoplayer2.ui.PlayerView
      android:id="@+id/video_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_gravity="center"
      app:auto_show="true"
      app:controller_layout_id="@layout/custom_exo_controller_view"
      app:fastforward_increment="10000"
      app:repeat_toggle_modes="none"
      app:resize_mode="fixed_width"
      app:rewind_increment="10000"
      app:surface_type="surface_view"
      app:use_controller="true" />

</FrameLayout>

那应该以您想要的方式获得 UI。

您可以根据需要在自定义控制器和代码中添加额外的控件,查找控件findViewById()并编写事件侦听器等。

于 2019-06-21T14:16:51.870 回答
21

好的,这花了我半天时间,直到我没有深入研究库代码并找到这样的文本:

要在整个应用程序中自定义 PlaybackControlView 的布局,或者仅针对某些配置,您可以在应用程序res/layout目录中定义exo_playback_control_view.xml布局文件。这些布局将覆盖 ExoPlayer 库提供的布局,并将被膨胀以供 PlaybackControlView 使用。

全文:https ://github.com/google/ExoPlayer/blob/release-v2/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java

另外,要补充一点,您可以在 PlayerView 中指定自定义布局,如下所示:

<com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/player_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:controller_layout_id="@layout/custom_controls"/>
于 2017-01-13T10:02:54.503 回答
9

实际上,调用播放和暂停方法的代码在PlayerControl类中。

如果您不想使用默认的 Android 媒体控制器 UI,请不要使用MediaController该类,在您的布局文件中使用自定义播放和暂停按钮创建自己的 UI,并将操作与按钮的 onClickListener 绑定。

要播放视频,请致电exoPlayer.setPlayWhenReady(true);

并暂停:调用exoPlayer.setPlayWhenReady(false);

如何为 android MediaController 创建自定义 UI类似的问题

于 2015-11-20T15:34:56.067 回答