Media3 udostępnia domyślny PlayerView
, który udostępnia opcje dostosowywania. W przypadku dalszego dostosowywania deweloperzy
wymagają wdrożenia własnych komponentów UI.
Sprawdzone metody
Zalecamy, aby w przypadku implementowania interfejsu multimediów połączonego z interfejsem Player
Media3 (np. ExoPlayer
, MediaController
lub niestandardowej implementacji Player
) trzymać się tych sprawdzonych metod, aby zapewnić jak najlepsze działanie interfejsu.
Przycisk odtwarzania/wstrzymania
Przycisk odtwarzania i wstrzymywania nie odpowiada bezpośrednio stanowi pojedynczego odtwarzacza. Na przykład użytkownik powinien mieć możliwość ponownego rozpoczęcia odtwarzania po jego zakończeniu lub niepowodzeniu, nawet jeśli odtwarzacz nie jest wstrzymany.
Aby uprościć implementację, Media3 udostępnia metody do decydowania, który przycisk wyświetlić (Util.shouldShowPlayButton
) i do obsługi jego naciśnięć (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));
Odsłuchuj aktualizacje stanu
Komponent UI musi dodać element Player.Listener
, aby otrzymywać informacje o zmianach stanu, które wymagają odpowiedniej aktualizacji interfejsu. Więcej informacji znajdziesz w sekcji Odsłuchiwanie zdarzeń odtwarzania.
Odświeżanie interfejsu użytkownika może być kosztowne, a zdarzeń graczy często pojawia się razem. Aby uniknąć zbyt częstego odświeżania interfejsu w krótkim czasie, lepiej jest nasłuchiwać tylko polecenia onEvents
i tam uruchamiać aktualizacje interfejsu:
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(); } } });
Obsługa dostępnych poleceń
Komponent interfejsu użytkownika ogólnego przeznaczenia, który może działać z różnymi implementacjami Player
, powinien sprawdzać dostępne polecenia odtwarzacza w celu wyświetlania lub ukrywania przycisków oraz aby nie wywoływać nieobsługiwanych metod:
Kotlin
nextButton.isEnabled = player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT)
Java
nextButton.setEnabled(player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT));