Taşıma kontrollerini kullan

Compose ile daha iyi hizmet oluşturun
Android TV OS için Jetpack Compose'u kullanarak minimum kodla etkileyici kullanıcı arayüzleri oluşturun.

Leanback kullanıcı arayüzü araç setinde, daha iyi bir kullanıcı deneyimi sunan oynatma kontrolleri bulunur. Video uygulamaları için aktarım kontrolleri video ileri geri oynatmayı destekler. sahip olmayabilirsiniz. Videoyu ilerletirken ekranda, videoda gezinmenize yardımcı olacak küçük resimler gösterilir.

Kitaplıkta soyut sınıflar ve önceden oluşturulmuş, kullanıma hazır uygulamalar bulunur özellikleri de kullanabilirsiniz. Önceden oluşturulmuş uygulamaları kullanarak çok fazla kod yazmadan zengin özelliklere sahip bir uygulamayı hızlıca 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 kullanıcı arayüzü araç seti, aktarma kontrolleri kullanıcı arayüzünü videoyu oynatan oynatıcıdan ayırır. Bu işlem iki bileşenle gerçekleştirilir: Taşıma kontrollerini (ve isteğe bağlı olarak videoyu) görüntülemek için bir oynatma desteği fragmanı ve bir medya oynatıcıyı kapsayacak bir oynatıcı adaptörü.

Oynatma parçası

Uygulamanızın kullanıcı arayüzü etkinliği, PlaybackSupportFragment veya VideoSupportFragment kullanmalıdır. Her ikisinde de Leanback aktarma kontrolleri bulunur:

Bir parçanın ObjectAdapter. kullanıcı arayüzünü geliştirmektir. Örneğin, "ilgili videolar" satırı eklemek için setAdapter() simgesini kullanın.

Oynatıcı Adaptörü

PlayerAdapter soyut bir sınıftır temel medya oynatıcıyı kontrol eder. Geliştiriciler seçebilir önceden oluşturulmuş MediaPlayerAdapter uygulamasını sağlayabilir veya hakkında daha fazla bilgi edineceksiniz.

Parçaları birbirine yapıştırma

Biraz "kontrol yapıştırıcısı" kullanmanız gerekir. oynatma parçasını gönderir. Leanback kitaplığı iki tür yapıştırıcı sağlar:

leanback taşıma kontrol tutkalı

Uygulamanızın video ileri geri oynatmayı desteklemesini istiyorsanız PlaybackTransportControlGlue

Ayrıca, yapıştırıcıyı oynatma fragmanına bağlayan, kullanıcı arayüzünde oynatma kontrollerini çizen ve durumlarını koruyan ve oynatma kontrol etkinliklerini yapıştırıcıya geri gönderen bir "yapıştırıcı ana makinesi" de belirtmeniz gerekir. Ana makine, oynatma parçası türüyle eşleşmelidir. Tekliflerinizi otomatikleştirmek ve optimize etmek için PlaybackSupportFragmentGlueHost PlaybackFragment ve VideoSupportFragmentGlueHost VideoFragment.

Aşağıda, Leanback taşımacılığın parçalarının nasıl kontrol uyumlu olması için

leanback taşıma kontrol tutkalı

Uygulamanızı bir arada tutan kod, kullanıcı arayüzünü tanımlayan PlaybackSupportFragment veya VideoSupportFragment içinde olmalıdır.

Sonraki Örneğin, uygulama PlaybackTransportControlGlue, adını playerGlue, ve VideoSupportFragment cihazını yeni oluşturulmuş bir MediaPlayerAdapter cihazına bağlıyor. Başlangıç VideoSupportFragment kurulum kodu, setHost() VideoSupportFragmentGlueHost - playerGlue. Kod, VideoSupportFragment sınıfını genişleten sınıfın içine yerleştirilir.

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ü yapıştırıcısını özelleştirme

Özelleştirilebilir PlaybackBannerControlGlue ve PlaybackTransportControlGlue değerini değiştirmek için PlaybackControlsRow.

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

Ekranın üst kısmındaki başlığı ve açıklamayı özelleştirmek için oynatma kontrolleri, geçersiz kıl onCreateRowPresenter():

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şlemlere ait kontrolleri gösterir.

PlaybackControlsRow içindeki işlemler iki gruba ayrılır: birincil işlemler ve ikincil işlemler. Birincil grubun kontrolleri arama çubuğunun üzerinde, ikincil grubun kontrolleri ise arama çubuğunun altında görünür. Başlat/duraklat düğmesi için başlangıçta yalnızca tek bir birincil işlem ve ikincil 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() değerini 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 kontrolleri oluşturmak ve PlaybackSeekUi kullanarak arama işlemlerine yanıt vermek için kendi PlaybackTransportRowPresenteruygulamanızı uygulayabilirsiniz.

Video ileri geri oynatma

Uygulamanızda VideoSupportFragment kullanılıyorsa ve videoyu ileri-geri sarmayı 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'ü genişleterek kendi sağlayıcınızı uygulamanız gerekir. Leanback Showcase uygulamasındaki örneği inceleyin. .