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

kaynak kimliklerinin "özel" olarak işaretlenmesiyle gösterilir.

PlayerView, oynatma kontrollerini ve ilerleme çubuğunu göstermek için PlayerControlView simgesini 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 çizilebilir öğelerinin listesi için PlayerControlView dokümanlarına bakın.

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

En iyi uygulamalar

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

Oynat/Duraklat düğmesi

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

Media3, kurulumu basitleştirmek için hangi düğmenin gösterileceğine (Util.shouldShowPlayButton) karar vermek ve düğmeye basma işlemlerini (Util.handlePlayPauseButtonAction) işlemek üzere yardımcı yöntemler sağlar:

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üncellemesi gerektiren durum değişikliklerinden haberdar olmak için Player.Listener eklemesi gerekir. Ayrıntılar için Oynatma etkinliklerini dinleme başlıklı makaleyi inceleyin.

Kullanıcı arayüzünü yenilemek maliyetli olabilir ve genellikle birden fazla oyuncu etkinliği aynı anda gerçekleşir. Kullanıcı arayüzünün kısa süre içinde çok sık yenilenmesini önlemek için genellikle yalnızca onEvents 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();
    }
  }
});

Herkese açık kullanıcı adı ile ilgili komutlar

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

Kotlin

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

Java

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

İlk karede deklanşör ve görüntü gösterimi

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

Bu güncellemeleri işlemek için yaygın bir yöntem, seçilen parçalarda (EVENT_TRACKS_CHANGED) herhangi bir değişiklik olduğunda ve ilk video karesi oluşturulduğunda (EVENT_RENDERED_FIRST_FRAME) Player.Listener.onEvents()'ı dinlemenin yanı sıra yeni bir resim kullanıma sunulduğunda ImageOutput.onImageAvailable()'ı 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, 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.
}