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));