Leanback aktarma kontrollerini kullanma

Leanback androidx kitaplığı, iyileştirilmiş kullanıcı deneyimi sağlayan yeni oynatma kontrollerine sahiptir. Video uygulamalarında aktarım kontrolleri, ileri/geri kontrolleriyle video ileri geri oynatmayı destekler. Ekranı ileri geri oynatırken videoda gezinmeye yardımcı olmak için küçük resimler gösterilir.

Kitaplıkta soyut sınıfların yanı sıra geliştiricilere daha ayrıntılı kontrol sağlayan kullanıma hazır uygulamalar bulunur. Önceden oluşturulmuş uygulamaları kullanarak, fazla kodlamaya gerek kalmadan hızla zengin özelliklere sahip bir uygulama oluşturabilirsiniz. Daha fazla özelleştirmeye ihtiyacınız varsa kitaplığın önceden oluşturulmuş bileşenlerinden herhangi birini genişletebilirsiniz.

Kontroller ve oynatıcı

Leanback kitaplığı, kullanıcı arayüzünü, taşıma kontrollerini video oynatan oynatıcıdan ayırır. Bu, iki bileşenle gerçekleştirilir: aktarım kontrollerini (ve isteğe bağlı olarak videoyu) görüntülemek için bir oynatma destek parçası ve medya oynatıcıyı kapsamak için bir oynatıcı adaptörü.

Parçayı oynat

Uygulamanızın kullanıcı arayüzü etkinliğinde PlaybackSupportFragment veya VideoSupportFragment kullanılmalıdır. Her ikisi de Leanback aktarma kontrollerini içerir:

Kullanıcı arayüzünü geliştirmek için bir parçanın ObjectAdapter özelliğini özelleştirebilirsiniz. Örneğin, "ilgili videolar" satırı eklemek için setAdapter() kullanın.

Oynatıcı Adaptörü

PlayerAdapter, alttaki medya oynatıcıyı kontrol eden soyut bir sınıftır. Geliştiriciler önceden oluşturulmuş MediaPlayerAdapter uygulamasını seçebilir veya bu sınıf için kendi uygulamalarını yazabilirler.

Parçaları birbirine yapıştırma

Oynatma parçasını oynatıcıya bağlamak için "kontrol tutkalı" kullanmanız gerekir. Leanback kitaplığı iki tür tutkal sağlar:

Leanback aktarma kontrol tutkalı

Uygulamanızın video oynatma özelliğini desteklemesini istiyorsanız PlaybackTransportControlGlue kullanmanız gerekir.

Ayrıca, tutkalı oynatma parçasına bağlayan, taşıma kontrollerini kullanıcı arayüzünde çizen ve bunların durumunu koruyan ve aktarım kontrolü etkinliklerini tekrar yapıştırıcıya ileten bir "yapışkan ana makine" belirtmeniz gerekir. Ana makine, oynatma parçası türüyle eşleşmelidir. PlaybackSupportFragmentGlueHost için PlaybackFragment, VideoSupportFragmentGlueHost ise VideoFragment ile kullanın.

Aşağıda, yastıklı taşıma kontrolünün parçalarının nasıl bir araya geldiğini gösteren bir resim verilmiştir:

Leanback aktarma kontrol tutkalı

Uygulamanızı birbirlerine yapıştıran kod, kullanıcı arayüzünü tanımlayan PlaybackSupportFragment veya VideoSupportFragment içinde olmalıdır.

Aşağıdaki örnekte, uygulama PlaybackTransportControlGlue adlı bir örneği oluşturur, playerGlue adını verir ve VideoSupportFragment öğesini yeni oluşturulan MediaPlayerAdapter öğesine bağlar. Bu bir VideoSupportFragment olduğundan, kurulum kodu playerGlue öğesine VideoSupportFragmentGlueHost eklemek için setHost() yöntemini çağırır. Kod, VideoSupportFragment aralığını genişleten sınıfın içine eklenir.

Kotlin

class MyVideoFragment : VideoSupportFragment() {

  fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      val playerGlue = PlaybackTransportControlGlue(getActivity(),
          MediaPlayerAdapter(getActivity()))
      playerGlue.setHost(VideoSupportFragmentGlueHost(this))
      playerGlue.addPlayerCallback(object : PlaybackGlue.PlayerCallback() {
          override fun onPreparedStateChanged(glue: PlaybackGlue) {
              if (glue.isPrepared()) {
                  playerGlue.seekProvider = MySeekProvider()
                  playerGlue.play()
              }
          }
      })
      playerGlue.setSubtitle("Leanback artist")
      playerGlue.setTitle("Leanback team at work")
      val uriPath = "android.resource://com.example.android.leanback/raw/video"
      playerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath))
  }
}

Java

public class MyVideoFragment extends VideoSupportFragment {

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      final PlaybackTransportControlGlue<MediaPlayerAdapter> playerGlue =
              new PlaybackTransportControlGlue(getActivity(),
                      new MediaPlayerAdapter(getActivity()));
      playerGlue.setHost(new VideoSupportFragmentGlueHost(this));
      playerGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
          @Override
          public void onPreparedStateChanged(PlaybackGlue glue) {
              if (glue.isPrepared()) {
                  playerGlue.setSeekProvider(new MySeekProvider());
                  playerGlue.play();
              }
          }
      });
      playerGlue.setSubtitle("Leanback artist");
      playerGlue.setTitle("Leanback team at work");
      String uriPath = "android.resource://com.example.android.leanback/raw/video";
      playerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath));
  }
}

Kurulum kodunun, medya oynatıcıdan gelen etkinlikleri işlemek için bir PlayerAdapter.Callback de tanımladığını unutmayın.

Kullanıcı arayüzü tutkallarını özelleştirme

PlaybackControlsRow değerini değiştirmek için PlaybackBannerControlGlue ve PlaybackTransportControlGlue öğelerini özelleştirebilirsiniz.

Başlığı ve açıklamayı özelleştirme

Oynatma kontrollerinin üst kısmındaki başlığı ve açıklamayı özelleştirmek için onCreateRowPresenter() öğesini geçersiz kılın:

Kotlin

override fun onCreateRowPresenter(): PlaybackRowPresenter {
    return super.onCreateRowPresenter().apply {
        (this as? PlaybackTransportRowPresenter)
                ?.setDescriptionPresenter(MyCustomDescriptionPresenter())
    }
}

Java

@Override
protected PlaybackRowPresenter onCreateRowPresenter() {
  PlaybackTransportRowPresenter presenter = (PlaybackTransportRowPresenter) super.onCreateRowPresenter();
  presenter.setDescriptionPresenter(new MyCustomDescriptionPresenter());
  return presenter;
}

Kontrol ekleme

Kontrol yapıştırıcısı, PlaybackControlsRow içindeki işlemlerin kontrollerini görüntüler.

PlaybackControlsRow içindeki işlemler iki gruba atanır: birincil işlemler ve ikincil işlemler. Arama çubuğunun üzerinde birincil grubun kontrolleri, ikincil grubun kontrolleri ise arama çubuğunun altında görünür. Başlangıçta, oynat/duraklat düğmesi için tek bir birincil işlem vardır ve ikincil bir işlem yoktur.

onCreatePrimaryActions() ve onCreateSecondaryActions() öğelerini geçersiz kılarak birincil ve ikincil gruplara işlem ekleyebilirsiniz.

Kotlin

private lateinit var repeatAction: PlaybackControlsRow.RepeatAction
private lateinit var pipAction: PlaybackControlsRow.PictureInPictureAction
private lateinit var thumbsUpAction: PlaybackControlsRow.ThumbsUpAction
private lateinit var thumbsDownAction: PlaybackControlsRow.ThumbsDownAction
private lateinit var skipPreviousAction: PlaybackControlsRow.SkipPreviousAction
private lateinit var skipNextAction: PlaybackControlsRow.SkipNextAction
private lateinit var fastForwardAction: PlaybackControlsRow.FastForwardAction
private lateinit var rewindAction: PlaybackControlsRow.RewindAction

override fun onCreatePrimaryActions(primaryActionsAdapter: ArrayObjectAdapter) {
    // Order matters, super.onCreatePrimaryActions() will create the play / pause action.
    // Will display as follows:
    // play/pause, previous, rewind, fast forward, next
    //   > /||      |<        <<        >>         >|
    super.onCreatePrimaryActions(primaryActionsAdapter)
    primaryActionsAdapter.apply {
        add(skipPreviousAction)
        add(rewindAction)
        add(fastForwardAction)
        add(skipNextAction)
    }
}

override fun onCreateSecondaryActions(adapter: ArrayObjectAdapter?) {
    super.onCreateSecondaryActions(adapter)
    adapter?.apply {
        add(thumbsDownAction)
        add(thumbsUpAction)
    }
}

Java

private PlaybackControlsRow.RepeatAction repeatAction;
private PlaybackControlsRow.PictureInPictureAction pipAction;
private PlaybackControlsRow.ThumbsUpAction thumbsUpAction;
private PlaybackControlsRow.ThumbsDownAction thumbsDownAction;
private PlaybackControlsRow.SkipPreviousAction skipPreviousAction;
private PlaybackControlsRow.SkipNextAction skipNextAction;
private PlaybackControlsRow.FastForwardAction fastForwardAction;
private PlaybackControlsRow.RewindAction rewindAction;

@Override
protected void onCreatePrimaryActions(ArrayObjectAdapter primaryActionsAdapter) {
    // Order matters, super.onCreatePrimaryActions() will create the play / pause action.
    // Will display as follows:
    // play/pause, previous, rewind, fast forward, next
    //   > /||      |<        <<        >>         >|
    super.onCreatePrimaryActions(primaryActionsAdapter);
    primaryActionsAdapter.add(skipPreviousAction);
    primaryActionsAdapter.add(rewindAction);
    primaryActionsAdapter.add(fastForwardAction);
    primaryActionsAdapter.add(skipNextAction);
}

@Override
protected void onCreateSecondaryActions(ArrayObjectAdapter adapter) {
    super.onCreateSecondaryActions(adapter);
    adapter.add(thumbsDownAction);
    adapter.add(thumbsUpAction);
}

Yeni işlemleri işlemek için onActionClicked() öğesini geçersiz kılmanız gerekir.

Kotlin

override fun onActionClicked(action: Action) {
    when(action) {
        rewindAction -> {
            // Handle Rewind
        }
        fastForwardAction -> {
            // Handle FastForward
        }
        thumbsDownAction -> {
            // Handle ThumbsDown
        }
        thumbsUpAction -> {
            // Handle ThumbsUp
        }
        else ->
            // The superclass handles play/pause and delegates next/previous actions to abstract methods,
            // so those two methods should be overridden rather than handling the actions here.
            super.onActionClicked(action)
    }
}

override fun next() {
    // Skip to next item in playlist.
}

override fun previous() {
    // Skip to previous item in playlist.
}

Java

@Override
public void onActionClicked(Action action) {
    if (action == rewindAction) {
        // Handle Rewind
    } else if (action == fastForwardAction ) {
        // Handle FastForward
    } else if (action == thumbsDownAction) {
        // Handle ThumbsDown
    } else if (action == thumbsUpAction) {
        // Handle ThumbsUp
    } else {
        // The superclass handles play/pause and delegates next/previous actions to abstract methods,
        // so those two methods should be overridden rather than handling the actions here.
        super.onActionClicked(action);
    }
}

@Override
public void next() {
    // Skip to next item in playlist.
}

@Override
public void previous() {
    // Skip to previous item in playlist.
}

Özel durumlarda, özel denetimleri oluşturmak ve PlaybackSeekUi kullanarak işlem yapma isteklerine yanıt vermek için kendi PlaybackTransportRowPresenter denetimlerinizi uygulamak isteyebilirsiniz.

Video ileri geri oynatma

Uygulamanız bir VideoSupportFragment kullanıyorsa ve video ileri geri hareketini desteklemek istiyorsanız.

ovma

PlaybackSeekDataProvider uygulamasını sağlamanız gerekir. Bu bileşen, kaydırma sırasında kullanılan video küçük resimlerini sağlar. PlaybackSeekDataProvider kapsamını genişleterek kendi sağlayıcınızı uygulamanız gerekir. Android TV GitHub deposundaki Android Leanback Vitrin örnek uygulamasındaki örneğe bakın. .