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:
PlaybackSupportFragment
, aktarım kontrollerini gerektiğinde gizlemek/göstermek için animasyon içerir.VideoSupportFragment
,PlaybackSupportFragment
'ü genişletir ve videoyu oluşturmak için birSurfaceView
'ye sahiptir.
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:
PlaybackBannerControlGlue
, oynatma parçasındaki oynatma kontrollerini "eski tarzda" çizer ve opak bir arka plana yerleştirir. (PlaybackBannerControlGlue
, desteği sonlandırılanPlaybackControlGlue
yerine kullanılır.)PlaybackTransportControlGlue
şeffaf arka plana sahip "yeni stil" kontrolleri kullanır.
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
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 PlaybackTransportRowPresenter
uygulamanızı uygulayabilirsiniz.
Video ileri geri oynatma
Uygulamanızda VideoSupportFragment
kullanılıyorsa ve videoyu ileri-geri sarmayı 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
'ü genişleterek kendi sağlayıcınızı uygulamanız gerekir.
Leanback Showcase uygulamasındaki örneği inceleyin.
.