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:
PlaybackSupportFragment
öğesi, aktarım denetimlerine animasyon ekleyerek gerektiğinde bunları gizleyin/gösterin.VideoSupportFragment
,PlaybackSupportFragment
öğesini genişletir ve videoyu oluşturmak içinSurfaceView
bulunur.
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:
PlaybackBannerControlGlue
, oynatma parçasındaki taşıma kontrollerini "eski stilde" çizerek opak bir arka planın içine yerleştirir. (PlaybackBannerControlGlue
, kullanımdan kaldırılanPlaybackControlGlue
yerini almıştır.)PlaybackTransportControlGlue
, şeffaf bir arka plana sahip "yeni stil" kontrolleri kullanır.
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:
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.
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.
.