Dostosowywanie interfejsu

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