Как разместить элементы управления Exoplayer за пределами PlayerView

Я использую Exoplayer2 для показа видео в своем приложении. Мне нужно, чтобы элементы управления были видны все время. Я могу заархивировать это, установив app:show_timeout="0". Но когда элементы управления всегда видны, они занимают место в PlayerView.

Я хотел бы показать элементы управления под PlayerView, чтобы я всегда мог показывать все видео.

Это мой файл макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent"
    tools:context=".MediaPlayerActivity"
    android:theme="@android:style/Theme.NoTitleBar"
    android:contentDescription="hf_hide_help">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/playerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:use_controller="true"
        app:rewind_increment="0"
        app:fastforward_increment="0"
        app:repeat_toggle_modes="none"
        app:show_timeout="0"
        />
</RelativeLayout>

А это мой exo_player_control_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:layoutDirection="ltr"
    android:background="#CC000000"
    android:orientation="vertical">

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

        <ImageButton android:id="@id/exo_play"
            style="@style/ExoMediaButton.Play"/>

        <ImageButton android:id="@id/exo_pause"
            style="@style/ExoMediaButton.Pause"/>

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

        <com.google.android.exoplayer2.ui.DefaultTimeBar
            android:id="@id/exo_progress"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="26dp"/>

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

    </LinearLayout>

</LinearLayout>

Вот как это выглядит: Игрок

А вот так это выглядит, когда нажимаю на плеер - элементы управления прячутся. Игрок без управления


person Walmar    schedule 15.08.2018    source источник
comment
Не могли бы вы добавить скриншот, пожалуйста?   -  person Maksym V.    schedule 15.08.2018
comment
Я добавил скриншоты.   -  person Walmar    schedule 15.08.2018
comment
Я создал XML-файл пользовательского элемента управления и добавил его в PlayerView в xml-файл, например app:controller_layout_id=@layout/custom_controls, но пользовательские элементы управления отображаются в PlayerView не за пределами представления проигрывателя. Пожалуйста, помогите мне, как отобразить пользовательские элементы управления вне PlayerView.? –   -  person Gyan Swaroop Awasthi    schedule 04.05.2021


Ответы (1)


Ваш вариант использования не является чем-то общим, и ExoPlayer его не поддерживает. В вашем случае вам нужно будет отключить элементы управления по умолчанию и добавить свои собственные элементы управления под представлением проигрывателя. Было бы очень легко построить макет и добавить к ним действия.

Обновление: (чтобы ответить на комментарий Гьяна о шкале времени)

Два подхода: (я объясняю стратегии, поскольку тысячи примеров кода уже доступны на SO и других сайтах)

1 - Мое предложение, которое отлично сработало для моих нужд: переопределить представление управления по умолчанию для экзоплеера (наличие представления с тем же именем в папке макетов сделает эту работу). Затем удалите все ненужные кнопки, которые вы убрали в своем пользовательском представлении, но просто оставьте шкалу времени в переопределенном виде. Таким образом, все действия, связанные с появлением/исчезновением, автоматически сохраняются на шкале времени, а все остальное вы будете видеть сами. Вам не нужно было бы беспокоиться об обработке временной шкалы, если бы вам нравился такой подход.

2- На тот случай, если вы настаиваете на том, чтобы выводить полосу времени под окном плеера, вам нужна горизонтальная полоса прогресса (обратите внимание, что вы можете настроить внешний вид представления прогресса в соответствии с вашим дизайном). Затем напишите прослушиватель на exoplayer, чтобы он брал тайминги (пройдено/осталось/текущее время воспроизведения) и вычислял и обновлял ход бара на их основе. Помните, что индикатор выполнения должен быть сенсорным (и фокусируемым), чтобы пользователь мог перетаскивать его вперед и назад. Затем вам нужно будет пересчитать время воспроизведения, когда пользователь перетаскивает прогресс. (очевидно, много кода и вычислений, но почти все просто). Надеюсь, это сработает для вас. Если вам нужны образцы кода, пожалуйста, дайте мне знать.

person Masoud Dadashi    schedule 27.08.2018
comment
Я создал XML-файл пользовательского элемента управления и добавил его в PlayerView в xml-файл, например app:controller_layout_id=@layout/custom_controls, но пользовательские элементы управления отображаются в PlayerView не за пределами представления проигрывателя. Пожалуйста, помогите мне, как отобразить пользовательские элементы управления вне PlayerView.? - person Gyan Swaroop Awasthi; 04.05.2021
comment
Если вы добавите его таким образом, используя app:controller_layout_id, поведение будет точно таким же, как у исходных элементов управления exoplayer. Просто поместите свои собственные контроллеры в другой вид и поместите его ниже вида игрока. (например, у вас может быть вертикальный линейный макет, в котором проигрыватель является первым дочерним элементом, а элементы управления - вторым дочерним элементом). надеюсь, ты понял - person Masoud Dadashi; 04.05.2021
comment
да, я создал Linearlayout (ориентация = вертикальная), и внутри него находится playerview, теперь я добавил второго дочернего элемента в качестве макета кадра, а внутри макета кадра я использовал ‹include layout=@layout/custom_controls android:layout_width=match_parent android:layout_height=wrap_content /› = ====› и я удалил app:controller_layout_id из playerview, теперь пользовательские элементы управления видны под playerview, но все элементы управления мертвы, не находятся в рабочей стадии, как мертвый пользовательский интерфейс. - person Gyan Swaroop Awasthi; 05.05.2021
comment
Конечно, это мертвый пользовательский интерфейс, если вы не добавите какой-либо код к своим кнопкам для выполнения действий. например, ваша пользовательская кнопка воспроизведения будет запускать этот фрагмент: exoPlayer.playWhenReady = true, а пауза должна быть запущена: exoPlayer.playWhenReady = false . Вы должны быть в состоянии выяснить остальное, я верю - person Masoud Dadashi; 05.05.2021
comment
Спасибо, @Masoud Dadashi, большое спасибо, теперь воспроизведение и пауза работают, но если я использую com.google.android.exoplayer2.ui.DefaultTimeBar для отображения прогресса, какое-нибудь решение для этого, как воспроизведение и пауза? как управлять прогрессом DefaultTimeBar? - person Gyan Swaroop Awasthi; 05.05.2021
comment
Я редактирую свой ответ, так как объяснение требует больше места, чем длина комментария. - person Masoud Dadashi; 05.05.2021