ExoPlayer:将控制器放置在视频下方而不重叠于视频之上

24

我有一个PlayerView,在纵向方向上占据了Activity的上半部分,下半部分显示一些文本。

我需要将控制器置于视频下方,而不重叠视频内容(它始终会显示)。默认情况下,当用户触摸视频时,控制器出现在视频底部,覆盖视频的底部部分。在我的情况下,我需要控制器固定在视频下方,与视频内容没有交集。

我查看了SimpleExoPlayerPlayerView APIs,但是没有找到任何可以这样做的方法。

问题:如何在 ExoPlayer 中将控制器放置在视频下方?

下面是布局的样子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_below="@id/video_view"
        android:scrollbars="vertical" />

</RelativeLayout>

2
你应该通过将ExoPlayer作为一个模块导入来编辑ExoPlayer的布局。 - Tara
2
你能否请发布你的问题的截图以便更好地理解? - Tara
1
@WaleedAsim暂时无法发布帖子。 但我已更新问题并提供了更多解释(希望现在清楚了)。 - Sasha Shpota
1
也许这个可以帮到你:https://dev59.com/FFwX5IYBdhLWcg3wlgTl - Tara
3个回答

30

这将使控件下移至屏幕底部:

<RelativeLayout 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">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:use_controller="false" />

    <com.google.android.exoplayer2.ui.PlayerControlView
        android:id="@+id/controls"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/video_view"
        app:show_timeout="0" />
   
</RelativeLayout>

然后在Java中:

PlayerView videoView = findViewById(R.id.video_view);
PlayerControlView controls = findViewById(R.id.controls);
controls.setPlayer(videoView.getPlayer());

编辑:根据@RashimiGautam的建议修改了我的答案


谢谢。这样我就可以同时拥有两个控件了。你知道如何删除原来的控件吗? - Sasha Shpota
@OleksandrShpota请看一下修改后的答案是否适用于您。 - Pierre
1
谢谢。它起作用了。虽然PlaybackControlView已经过时了 - 我用PlayerControlView替换了它。 - Sasha Shpota
我更新了你的答案,并提供了最终解决方案,这对我很有效。 - Sasha Shpota
1
您不能在controls.setPlayer(videoView)中设置PlayerView。 - Bhaumik Ghodasara
4
你需要将 ExoPlayer 的引用传递给 controls.setPlayer(player)。 - Bhaumik Ghodasara

9
请参考 @Pierre 的回答。
如果要从上面的 PlayerView 中删除控制器,您可以在Java文件中编写 player.showController(false) 并使用 @id/video_view。或者,在xml中使用 app:use_controller:false。这样您将只能看到视频而没有控制器在顶部。并将其链接到一个新的控制器,即视频底部的 @id/controls

4

这个可能会给你一个想法,同时你尝试过覆盖控件吗?

举例来说,假设我们只希望播放控件由一个位于视图中央的播放/暂停按钮组成。我们可以通过在应用程序的res/layout目录下创建exo_playback_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>

请注意,在布局中,@id/exo_play@id/exo_pause是ExoPlayer库定义的标准ID。使用标准ID是必需的,以便可以识别子视图,将其绑定到播放器并以适当的方式进行更新。每个视图的标准ID的完整列表可以在PlaybackControlViewSimpleExoPlayerView的Javadoc中找到。每个标准ID的使用是可选的。
参考链接:https://medium.com/google-exoplayer/customizing-exoplayers-ui-components-728cf55ee07a

我已经知道如何隐藏除播放和暂停按钮之外的所有按钮。但是如何将控制栏固定在视频视图下方呢? - Sasha Shpota
你可以覆盖控制栏,然后将其放置在视频下方。 - Tejashwi Kalp Taru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接