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