Bộ công cụ Leanback UI có các nút điều khiển chế độ phát trải nghiệm người dùng. Đối với các ứng dụng video, các nút điều khiển truyền tải có hỗ trợ lọc bỏ video nhờ nút điều khiển tiến và lùi. Trong khi tua, màn hình xuất hiện hình thu nhỏ để giúp điều hướng xuyên suốt video.
Thư viện này bao gồm các lớp trừu tượng cũng như các phương thức triển khai tích hợp sẵn, tích hợp sẵn giúp nhà phát triển kiểm soát chặt chẽ hơn. Sử dụng thư viện tạo sẵn , bạn có thể nhanh chóng tạo một ứng dụng có nhiều tính năng mà không cần lập trình nhiều. Nếu cần tuỳ chỉnh thêm, bạn có thể mở rộng bất kỳ thư viện tạo sẵn nào thành phần.
Các nút điều khiển và trình phát
Bộ công cụ Leanback UI tách riêng giao diện người dùng điều khiển truyền tải khỏi trình phát phát lại video. Điều này được thực hiện bằng hai thành phần: mảnh hỗ trợ phát để hiển thị các nút điều khiển truyền tải (và video) và bộ chuyển đổi trình phát để đóng gói trình phát nội dung đa phương tiện.
Mảnh phát
Hoạt động trên giao diện người dùng của ứng dụng nên sử dụng
PlaybackSupportFragment
hoặc một
VideoSupportFragment
Cả hai đều chứa các trình điều khiển truyền tảiLeanback:
PlaybackSupportFragment
tạo ảnh động cho các thành phần điều khiển truyền tải để ẩn/hiển thị các thành phần đó khi cần.VideoSupportFragment
mở rộngPlaybackSupportFragment
và cóSurfaceView
để kết xuất video.
Bạn có thể tuỳ chỉnh mã
ObjectAdapter
để cải thiện giao diện người dùng. Ví dụ: hãy sử dụng
setAdapter()
để thêm thẻ "video có liên quan" hàng.
Bộ chuyển đổi trình phát
PlayerAdapter
là một lớp trừu tượng
điều khiển trình phát nội dung đa phương tiện cơ bản. Nhà phát triển có thể chọn
cách triển khai MediaPlayerAdapter
tạo sẵn hoặc ghi
cách triển khai riêng của họ đối với lớp này.
Keo các mảnh lại với nhau
Bạn phải dùng "keo kiểm soát" nào đó để kết nối mảnh phát cho trình phát. Thư giãn thư viện cung cấp hai loại keo:
PlaybackBannerControlGlue
hoà các nút điều khiển truyền tải trong mảnh phát ở "kiểu cũ", đặt chúng bên trong nền mờ. (PlaybackBannerControlGlue
) thay thếPlaybackControlGlue
, không được dùng nữa.)PlaybackTransportControlGlue
sử dụng "kiểu mới" các nút điều khiển có nền trong suốt.
Nếu muốn ứng dụng của mình hỗ trợ lọc bỏ trong video, bạn phải sử dụng
PlaybackTransportControlGlue
.
Bạn cũng cần chỉ định một "glue Host" để
liên kết keo với quá trình phát
mảnh này vẽ các thành phần điều khiển truyền tải trong giao diện người dùng và duy trì trạng thái của chúng, đồng thời
chuyển các sự kiện kiểm soát truyền tải trở lại keo. Máy chủ lưu trữ phải khớp với loại mảnh phát. Sử dụng
PlaybackSupportFragmentGlueHost
bằng
một PlaybackFragment
và
VideoSupportFragmentGlueHost
có
VideoFragment
.
Sau đây là hình minh hoạ cách các thành phần của hệ thống điều khiển vận tải dựa trên cơ sở hạ tầng (Leanback) kết hợp với nhau:
Mã gắn ứng dụng của bạn với nhau phải nằm bên trong
PlaybackSupportFragment
hoặc VideoSupportFragment
xác định giao diện người dùng.
Trong phần sau
ví dụ: ứng dụng tạo một thực thể của PlaybackTransportControlGlue
,
đặt tên nó là playerGlue
,
và kết nối VideoSupportFragment
của nó với một MediaPlayerAdapter
mới tạo. Từ
đây là VideoSupportFragment
mà mã thiết lập gọi setHost()
để đính kèm
VideoSupportFragmentGlueHost
đến playerGlue
. Mã có trong lớp
mở rộng VideoSupportFragment
.
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)); } }
Xin lưu ý rằng mã thiết lập cũng xác định PlayerAdapter.Callback
để xử lý các sự kiện từ
trình phát nội dung đa phương tiện.
Tuỳ chỉnh keo giao diện người dùng
Bạn có thể tuỳ chỉnh
PlaybackBannerControlGlue
và PlaybackTransportControlGlue
để thay đổi
PlaybackControlsRow
.
Tuỳ chỉnh tiêu đề và nội dung mô tả
Cách tuỳ chỉnh tiêu đề và nội dung mô tả ở đầu
bộ điều khiển chế độ phát, ghi đè
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; }
Thêm chế độ điều khiển
Keo điều khiển hiển thị chế độ điều khiển cho các thao tác trong PlaybackControlsRow
.
Các hành động trong PlaybackControlsRow
được chỉ định cho hai nhóm: hành động chính và hành động phụ
hành động. Các nút điều khiển cho nhóm chính xuất hiện phía trên thanh tìm kiếm và các nút điều khiển cho
nhóm phụ xuất hiện bên dưới thanh tìm kiếm. Ban đầu, bạn chỉ cần thực hiện một hành động chính
cho nút phát/tạm dừng và không có hành động phụ nào.
Bạn có thể thêm các hành động vào nhóm chính và nhóm phụ bằng cách ghi đè
onCreatePrimaryActions()
và
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); }
Bạn phải ghi đè
onActionClicked()
để xử lý các thao tác mới.
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. }
Trong các trường hợp đặc biệt, bạn nên triển khai phương thức
PlaybackTransportRowPresenter
để hiển thị các chế độ điều khiển tuỳ chỉnh và phản hồi các thao tác tìm kiếm bằng cách sử dụng
PlaybackSeekUi
Loại bỏ video
Nếu ứng dụng của bạn dùng VideoSupportFragment
và bạn muốn hỗ trợ lọc bỏ trong video.
Bạn
cần cung cấp phương thức triển khai PlaybackSeekDataProvider
.
Thành phần này cung cấp hình thu nhỏ video được dùng khi cuộn.
Bạn phải triển khai trình cung cấp của riêng mình bằng cách mở rộng
PlaybackSeekDataProvider
.
Xem ví dụ trong
Ứng dụng Leanback Showcase.
của Google.