Anpassungen der Benutzeroberfläche

Media3 stellt einen Standard-PlayerView mit einigen Anpassungsoptionen bereit. Für jede weitere Anpassung wird von App-Entwicklern erwartet, dass sie ihre eigenen UI-Komponenten implementieren.

Best Practices

Bei der Implementierung einer Medien-UI, die mit einem Media3-Player verbunden ist (z. B. ExoPlayer, MediaController oder einer benutzerdefinierten Player-Implementierung), sollten Anwendungen diesen Best Practices folgen, um die Benutzeroberfläche optimal zu nutzen.

Schaltfläche für Wiedergabe/Pause

Die Wiedergabe- und Pausenschaltflächen entsprechen nicht direkt einem einzelnen Playerstatus. Beispielsweise sollte ein Nutzer in der Lage sein, die Wiedergabe nach Ende oder fehlgeschlagener Wiedergabe neu zu starten, auch wenn der Player nicht pausiert ist.

Um die Implementierung zu vereinfachen, bietet Media3 Dienstprogrammmethoden, mit denen entschieden wird, welche Schaltfläche angezeigt werden soll (Util.shouldShowPlayButton) und wie das Drücken von Tasten gehandhabt wird (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));

Statusaktualisierungen anhören

Die UI-Komponente muss eine Player.Listener hinzufügen, um über Statusänderungen informiert zu werden, die eine entsprechende UI-Aktualisierung erfordern. Weitere Informationen findest du unter Wiedergabeereignisse warten.

Das Aktualisieren der Benutzeroberfläche kann kostspielig sein und häufig kommen mehrere Spielerereignisse zusammen. Damit die UI nicht zu oft innerhalb kurzer Zeit aktualisiert wird, ist es im Allgemeinen besser, nur auf onEvents zu warten und von dort aus UI-Aktualisierungen auszulösen:

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

Verfügbare Befehle verarbeiten

Eine allgemeine UI-Komponente, die möglicherweise mit verschiedenen Player-Implementierungen verwendet werden muss, sollte die verfügbaren Player-Befehle prüfen, um Schaltflächen ein- oder auszublenden und das Aufrufen nicht unterstützter Methoden zu vermeiden:

Kotlin

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

Java

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