Personalizaciones de la IU

Media3 proporciona un objeto PlayerView predeterminado que brinda algunas opciones de personalización. Para cualquier personalización adicional, se espera que los desarrolladores de apps implementen sus propios componentes de la IU.

Prácticas recomendadas

Cuando se implementa una IU multimedia que se conecta a un Player de Media3 (por ejemplo, ExoPlayer, MediaController o una implementación de Player personalizada), se recomienda que las apps sigan estas prácticas recomendadas para brindar la mejor experiencia de IU.

Botón Reproducir/Pausar

Los botones de reproducción y pausa no están directamente relacionados con un estado de un solo jugador. Por ejemplo, un usuario debería poder reiniciar la reproducción después de que finalizó o falló, incluso si el reproductor no está pausado.

Para simplificar la implementación, Media3 proporciona métodos de utilidad para decidir qué botón mostrar (Util.shouldShowPlayButton) y controlar las pulsaciones de botones (Util.handlePlayPauseButtonAction):

Kotlin

val shouldShowPlayButton: Boolean = Util.shouldShowPlayButton(player)
playPauseButton.setImageDrawable(if (shouldShowPlayButton) playDrawable else pauseDrawable)
playPauseButton.setOnClickListener { Util.handlePlayPauseButtonAction(player) }

Java

boolean shouldShowPlayButton = Util.shouldShowPlayButton(player);
playPauseButton.setImageDrawable(shouldShowPlayButton ? playDrawable : pauseDrawable);
playPauseButton.setOnClickListener(view -> Util.handlePlayPauseButtonAction(player));

Cómo escuchar actualizaciones de estado

El componente de la IU debe agregar un Player.Listener para recibir información sobre los cambios de estado que requieran una actualización de la IU correspondiente. Consulta Cómo escuchar eventos de reproducción para obtener más detalles.

Actualizar la IU puede ser costoso, y los eventos de varios jugadores suelen llegar juntos. Para evitar actualizar la IU con demasiada frecuencia en un período corto, en general, es mejor escuchar solo onEvents y activar las actualizaciones de la IU desde allí:

Kotlin

player.addListener(object : Player.Listener{
  override fun onEvents(player: Player, events: Player.Events){
    if (events.containsAny(
        Player.EVENT_PLAY_WHEN_READY_CHANGED,
        Player.EVENT_PLAYBACK_STATE_CHANGED,
        Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED)) {
      updatePlayPauseButton()
    }
    if (events.containsAny(Player.EVENT_REPEAT_MODE_CHANGED)) {
      updateRepeatModeButton()
    }
  }
})

Java

player.addListener(new Player.Listener() {
  @Override
  public void onEvents(Player player, Player.Events events) {
    if (events.containsAny(
        Player.EVENT_PLAY_WHEN_READY_CHANGED,
        Player.EVENT_PLAYBACK_STATE_CHANGED,
        Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED)) {
      updatePlayPauseButton();
    }
    if (events.containsAny(Player.EVENT_REPEAT_MODE_CHANGED)) {
      updateRepeatModeButton();
    }
  }
});

Cómo controlar los comandos disponibles

Un componente de IU de uso general que podría necesitar funcionar con diferentes implementaciones de Player debe verificar los comandos del reproductor disponibles para ocultar o mostrar los botones y evitar llamar a métodos no compatibles:

Kotlin

nextButton.isEnabled = player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT)

Java

nextButton.setEnabled(player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT));