Taşıma kontrollerini kullan

Compose ile daha iyi hizmet verin
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, videoların görünümünü ve en iyi uygulamaları paylaşacağız. Video uygulamaları için aktarım kontrolleri video ileri geri oynatmayı destekler. sahip olmayabilirsiniz. İleri geri oynatmaya devam ederken küçük resimler kullanmanızı öneririz.

Kitaplıkta soyut sınıflar ve önceden oluşturulmuş, kullanıma hazır uygulamalar bulunur özellikleri de kullanabilirsiniz. Önceden oluşturulmuş sayesinde, çok fazla kodlamaya gerek olmadan hızlı bir şekilde zengin özelliklere sahip bir uygulama geliştirebilirsiniz. Daha fazla özelleştirmeye ihtiyacınız varsa, kitaplıktaki önceden oluşturulmuş bileşenlerine ayıralım.

Kontroller ve oynatıcı

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

Oynatma parçası

Uygulamanızın Kullanıcı Arayüzü Etkinliği, PlaybackSupportFragment veya a VideoSupportFragment. Her ikisi de leanback aktarım denetimlerini içerir:

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

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. Arkaya Yaslanma kitaplığı iki tür yapıştırıcı sağlar:

  • PlaybackBannerControlGlue "eski stildeki" oynatma parçasına aktarma kontrollerini yerleştirir ve bu denetimleri çerçeve içinde görünmesidir. (PlaybackBannerControlGlue) PlaybackControlGlue öğesinin yerini alır, Bu teklif artık kullanımdan kaldırılmıştır.)
  • PlaybackTransportControlGlue. "yeni stil" ifadesini kullanıyor bir arka planla kontrol edebilirsiniz.

leanback taşıma kontrol tutkalı

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

Ayrıca bir "bağlayıcı ana makine" belirtmeniz gerekir verileri oynatmaya yapıştırıcıyı bağlar parçasını oluşturur, arayüzde aktarım denetimlerini çizer ve durumlarını korur ve aktarım kontrolü etkinliklerini birleştiriciye iletir. 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ı birbirine bağlayan kod, Kullanıcı arayüzünü tanımlayan PlaybackSupportFragment veya VideoSupportFragment.

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 sınıfın içinde yer alır VideoSupportFragment öğesini genişletir.

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, şuradan gelen etkinlikleri işlemek için bir PlayerAdapter.Callback medya oynatıcıya gidin.

Kullanıcı arayüzü birleştiricisini özelleştirme

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

Başlık 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;
}

Denetim ekleme

Kontrol yapıştırıcısı, PlaybackControlsRow içindeki işlemlere ait kontrolleri gösterir.

PlaybackControlsRow üzerindeki işlemler şu iki gruba atanır: birincil işlemler ve ikincil işlemler bölümüne gidin. Birincil gruba ilişkin denetimler arama çubuğunun üzerinde görünür ve arama çubuğunun altında ikincil grup görünür. Başlangıçta yalnızca tek bir birincil işlem vardır oynatma/duraklatma düğmesi, ikincil hiçbir işlem yoktur.

Geçersiz kılarak birincil ve ikincil gruplara işlem ekleyebilirsiniz. onCreatePrimaryActions() ve onCreateSecondaryActions().

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

Geçersiz kılmanız gerekir Yeni işlemleri işlemek için onActionClicked().

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, kendi çözümünüze PlaybackTransportRowPresenter. ve PlaybackSeekUi.

Video ileri geri oynatma

Uygulamanızda VideoSupportFragment kullanılıyorsa ve video ileri geri oynatmayı desteklemek istiyorsanız.

ovma

Siz PlaybackSeekDataProvider uygulanması gerekir. Bu bileşen, kaydırma sırasında kullanılan video küçük resimlerini sağlar. Şu süreyi uzatarak kendi sağlayıcınızı uygulamanız gerekir: PlaybackSeekDataProvider Örneği Leanback Vitrin uygulaması. ,