Leanback UI 툴킷에는 더 나은 선택과 향상된 경험을 제공하는 재생 컨트롤이 있습니다. 있습니다. 동영상 앱의 경우 전송 컨트롤에서 동영상 스크러빙을 지원합니다. 사용할 수 있습니다. 스크러빙하는 동안 디스플레이에 동영상을 탐색하는 데 도움이 됩니다.
라이브러리에는 추상 클래스와 사전 빌드된 즉시 사용 가능한 구현이 포함되어 있습니다. 개발자에게 보다 세밀한 제어 기능을 제공합니다. 사전 빌드된 많은 코딩 없이도 기능이 풍부한 앱을 신속하게 빌드할 수 있습니다. 더 많은 맞춤설정이 필요한 경우 라이브러리의 미리 빌드된 라이브러리를 확장하면 됩니다. 구성할 수 있습니다.
컨트롤 및 플레이어
Leanback UI 툴킷은 전송 컨트롤 UI를 동영상을 재생하는 플레이어입니다. 이 작업은 다음 두 가지 구성 요소로 이루어집니다. 전송 컨트롤을 표시하기 위한 재생 지원 프래그먼트 (및 선택적으로 동영상) 및 플레이어 어댑터를 통해 미디어 플레이어를 캡슐화할 수 있습니다.
재생 프래그먼트
앱의 UI 활동은
PlaybackSupportFragment
또는 a
VideoSupportFragment
입니다.
둘 다 leanback 전송 컨트롤을 포함하고 있습니다.
PlaybackSupportFragment
는 전송 컨트롤을 애니메이션 처리하여 필요에 따라 숨기거나 표시합니다.VideoSupportFragment
는PlaybackSupportFragment
를 확장하고, 동영상을 렌더링하는SurfaceView
를 포함합니다.
프래그먼트의 속성을
ObjectAdapter
UI를 개선할 수 있습니다 예를 들어
setAdapter()
'관련 동영상'을 추가하여 행
PlayerAdapter
PlayerAdapter
는 추상 클래스로,
기본 미디어 플레이어를 제어합니다. 개발자는
사전 빌드된 MediaPlayerAdapter
구현을 변경하거나
자체 구현입니다.
요소 연결
'제어 접착제'를 사용해야 합니다. 재생 프래그먼트를 연결하고 반환합니다. 린백 라이브러리는 두 가지 종류의 글루를 제공합니다.
PlaybackBannerControlGlue
는 '이전 스타일'의 재생 프래그먼트에 전송 컨트롤을 배치하고 확인합니다. (PlaybackBannerControlGlue
PlaybackControlGlue
를 대체합니다. 지원 중단되었습니다.)PlaybackTransportControlGlue
'새 스타일' 사용 컨트롤이 추가된 것을 볼 수 있습니다.
앱에서 동영상 스크러빙을 지원하려면 다음을 사용해야 합니다.
PlaybackTransportControlGlue
'글루 호스트'도 지정해야 합니다. 저것
접착제를 재생에
프래그먼트를 호출하고 UI에서 전송 컨트롤을 그리고 상태를 유지합니다.
전송 제어 이벤트를 다시 글루로 전달합니다. 이 호스트는 재생 프래그먼트 유형과 일치해야 합니다. 사용
PlaybackSupportFragmentGlueHost
,
PlaybackFragment
및
VideoSupportFragmentGlueHost
,
VideoFragment
입니다.
이 그림은 leanback 전송 컨트롤의 요소가 어떻게 맞추기:
앱을 묶는 코드는
UI를 정의하는 PlaybackSupportFragment
또는 VideoSupportFragment
입니다.
다음에서
예를 들어 앱은 PlaybackTransportControlGlue
의 인스턴스를 생성합니다.
이름을 playerGlue
로 지정하고
VideoSupportFragment
를 새로 생성된 MediaPlayerAdapter
에 연결합니다. 이후
VideoSupportFragment
입니다. 설정 코드가 setHost()
를 호출하여
VideoSupportFragmentGlueHost
에서 playerGlue
(으)로 코드는 클래스 내에 포함되어 있습니다.
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)) } }
자바
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)); } }
설정 코드는 PlayerAdapter.Callback
도 정의하여
없습니다.
UI 글루 맞춤설정
사용자는
PlaybackBannerControlGlue
및 PlaybackTransportControlGlue
를
PlaybackControlsRow
입니다.
제목과 설명 맞춤설명
페이지 상단에서 제목과 설명을 맞춤설정하려면
재생 컨트롤, 재정의
onCreateRowPresenter()
:
Kotlin
override fun onCreateRowPresenter(): PlaybackRowPresenter { return super.onCreateRowPresenter().apply { (this as? PlaybackTransportRowPresenter) ?.setDescriptionPresenter(MyCustomDescriptionPresenter()) } }
자바
@Override protected PlaybackRowPresenter onCreateRowPresenter() { PlaybackTransportRowPresenter presenter = (PlaybackTransportRowPresenter) super.onCreateRowPresenter(); presenter.setDescriptionPresenter(new MyCustomDescriptionPresenter()); return presenter; }
컨트롤 추가
컨트롤 글루에서는 PlaybackControlsRow
에 작업 컨트롤을 표시합니다.
PlaybackControlsRow
의 작업
두 그룹(기본 작업 및 보조 작업)에 할당됩니다.
작업을 참조하세요. 기본 그룹용 컨트롤은 탐색바 위에 표시되고
보조 그룹은 탐색바 아래에 표시됩니다. 처음에는 기본 액션이 하나만 있습니다.
재생/일시중지 버튼에 해당하며 보조 작업은 없습니다.
다음을 재정의하여 기본 및 보조 그룹에 작업을 추가할 수 있습니다.
onCreatePrimaryActions()
및
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) } }
자바
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); }
재정의해야 함
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. }
자바
@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. }
특별한 경우에는
PlaybackTransportRowPresenter
를 사용하여 맞춤 컨트롤을 렌더링하고
PlaybackSeekUi
입니다.
동영상 스크러빙
앱에서 VideoSupportFragment
를 사용하며 동영상 스크러빙을 지원하려는 경우
나
PlaybackSeekDataProvider
구현을 제공해야 합니다.
이 구성요소는 스크롤할 때 사용되는 동영상 미리보기 이미지를 제공합니다.
다음을 확장하여 자체 제공자를 구현해야 합니다.
PlaybackSeekDataProvider
다음 예제를 참조하세요.
<ph type="x-smartling-placeholder"></ph>
Leanback 쇼케이스 앱에 설명되어 있습니다.
에서 자세한 내용을 확인하실 수 있습니다.