Kullanıcı arayüzü özelleştirmeleri

Media3, bazı özelleştirme seçenekleri sunan varsayılan bir PlayerView sağlar.

Çizilebilir öğeleri geçersiz kılma

PlayerView, oynatma kontrollerini ve ilerleme çubuğunu göstermek için PlayerControlView kullanır. PlayerControlView tarafından kullanılan çizilebilir öğeler, uygulamanızda tanımlanan aynı ada sahip çizilebilir öğelerle geçersiz kılınabilir. Geçersiz kılınabilecek kontrol çizilebilirlerinin listesi için PlayerControlView belgelerine bakın.

Daha fazla özelleştirme için uygulama geliştiricilerin kendi kullanıcı arayüzü bileşenlerini uygulamaları beklenir. Ancak başlamanıza yardımcı olacak bazı en iyi uygulamaları aşağıda bulabilirsiniz.

En iyi uygulamalar

Uygulamaların, Media3 Player'e (ör. ExoPlayer, MediaController veya özel bir Player uygulaması) bağlanan bir medya kullanıcı arayüzü uygularken en iyi kullanıcı arayüzü deneyimi için aşağıdaki en iyi uygulamaları izlemesi önerilir.

Oynat/Duraklat düğmesi

Oynat ve duraklat düğmesi, tek bir oynatıcı durumuna doğrudan karşılık gelmez. Örneğin, oynatıcı duraklatılmamış olsa bile kullanıcı, oynatma işlemi sona erdikten veya başarısız olduktan sonra oynatmayı yeniden başlatabilmelidir.

Media3, uygulamayı basitleştirmek için hangi düğmenin gösterileceğine (Util.shouldShowPlayButton) ve düğmeye basma işlemlerinin nasıl işleneceğine (Util.handlePlayPauseButtonAction) karar veren yardımcı yöntemler sunar:

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

Durum güncellemelerini dinleme

Kullanıcı arayüzü bileşeninin, ilgili kullanıcı arayüzü güncellemesini gerektiren durum değişikliklerinden haberdar olması için bir Player.Listener eklemesi gerekir. Ayrıntılar için Oynatma etkinliklerini dinleme bölümüne bakın.

Kullanıcı arayüzünü yenilemek maliyetli olabilir ve birden fazla oynatıcı etkinliği genellikle birlikte gerçekleşir. Kullanıcı arayüzünü kısa bir süre içinde çok sık yenilemekten kaçınmak için genellikle yalnızca onEvents öğesini dinlemek ve kullanıcı arayüzü güncellemelerini buradan tetiklemek daha iyidir:

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

Kullanılabilir komutları işleme

Farklı Player uygulamalarıyla çalışması gerekebilecek genel amaçlı bir kullanıcı arayüzü bileşeni, düğmeleri göstermek veya gizlemek ve desteklenmeyen yöntemleri çağırmaktan kaçınmak için mevcut oynatıcı komutlarını kontrol etmelidir:

Kotlin

nextButton.isEnabled = player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)

Java

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

İlk kare deklanşörü ve resim ekranı

Bir kullanıcı arayüzü bileşeni video veya resim gösterdiğinde genellikle gerçek ilk kare veya resim kullanılabilir olana kadar yer tutucu bir deklanşör görünümü kullanır. Ayrıca, karma video ve resim oynatma, resim görünümünün uygun zamanlarda gizlenmesini ve gösterilmesini gerektirir.

Bu güncellemeleri işlemenin yaygın bir yolu, seçilen parçalardaki (EVENT_TRACKS_CHANGED) değişiklikler ve ilk video karesinin oluşturulduğu (EVENT_RENDERED_FIRST_FRAME) zaman için Player.Listener.onEvents()'i, yeni bir resim kullanıma sunulduğunda ise ImageOutput.onImageAvailable()'i dinlemektir:

Kotlin

override fun onEvents(player: Player, events: Player.Events) {
  if (events.contains(Player.EVENT_TRACKS_CHANGED)) {
    // If no video or image track: show shutter, hide image view.
    // Otherwise: do nothing to wait for first frame or image.
  }
  if (events.contains(Player.EVENT_RENDERED_FIRST_FRAME)) {
    // Hide shutter, hide image view.
  }
}

override fun onImageAvailable(presentationTimeUs: Long, bitmap: Bitmap) {
  // Show shutter, set image and show image view.
}

Java

@Override
public void onEvents(Player player, Player.Events events) {
  if (events.contains(Player.EVENT_TRACKS_CHANGED)) {
    // If no video or image track: show shutter, hide image view.
    // Otherwise: do nothing to wait for first frame or image.
  }
  if (events.contains(Player.EVENT_RENDERED_FIRST_FRAME)) {
    // Hide shutter, hide image view.
  }
}

@Override
public void onImageAvailable(long presentationTimeUs, Bitmap bitmap) {
  // Show shutter, set image and show image view.
}