Aplikacja odtwarza multimedia wymagają komponentów interfejsu do wyświetlania multimediów sterowanie odtwarzaniem. Biblioteka Media3 ma moduł interfejsu, który zawiera różne komponenty interfejsu. Aby utworzyć zależność od modułu interfejsu użytkownika, dodaj tę zależność:
implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"
Najważniejszym elementem jest PlayerView
, czyli widok odtwarzania multimediów.
PlayerView
wyświetla film, obrazy, napisy i okładkę albumu podczas odtwarzania, a także elementy sterujące odtwarzaniem.
PlayerView
ma metodę setPlayer
dołączania i odłączania (przez pominięcie null
) instancji odtwarzacza.
Widok odtwarzacza
PlayerView
może służyć do odtwarzania filmów, obrazów i dźwięku. Renderuje on filmy i napisy w przypadku odtwarzania wideo, bitmapy w przypadku odtwarzania obrazu oraz może wyświetlać elementy graficzne zawarte w metadanych w plikach audio. Możesz go umieścić w plikach układu tak samo jak każdy inny komponent UI. Na przykład pole PlayerView
może być uwzględnione w tym pliku XML:
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:show_buffering="when_playing"
app:show_shuffle_button="true"/>
Fragment kodu powyżej pokazuje, że PlayerView
zawiera kilka atrybutów. Za pomocą tych atrybutów można dostosować działanie widoku,
a także jej wygląd i styl. Większość z tych atrybutów ma odpowiednie metody settera, których można używać do dostosowywania widoku w czasie wykonywania.
PlayerView
Javadoc zawiera listę tych atrybutów i metod określania w języku:
.
Po zadeklarowaniu widoku w pliku szablonu można go wyszukać w
Metoda onCreate
aktywności:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView = findViewById(R.id.player_view) }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView = findViewById(R.id.player_view); }
Po zainicjowaniu odtwarzacza można dołączyć go do widoku, wywołując
setPlayer
:
// Instantiate the player. val player = ExoPlayer.Builder(context).build() // Attach player to the view. playerView.player = player // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare()
// Instantiate the player. player = new ExoPlayer.Builder(context).build(); // Attach player to the view. playerView.setPlayer(player); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare();
Wybierz typ nawierzchni
Atrybut surface_type
elementu PlayerView
pozwala określić typ powierzchni, na której wyświetlany jest film. Oprócz wartości spherical_gl_surface_view
(która jest wartością specjalną dla odtwarzania filmów sferycznych) i video_decoder_gl_surface_view
(która służy do renderowania filmów za pomocą rendererów rozszerzeń) dozwolone są wartości surface_view
, texture_view
i none
. Jeśli widok służy tylko do odtwarzania dźwięku, należy użyć none
, aby uniknąć tworzenia powierzchni, ponieważ może to być kosztowne.
Jeśli widok służy do odtwarzania zwykłego filmu, należy użyć parametru surface_view
lub texture_view
. SurfaceView
ma wiele zalet w porównaniu z TextureView
w kategorii
Odtwarzanie filmu:
- Znacznie mniejsza moc konsumpcja danych urządzenia.
- Dokładniejsze ustalanie czasu wyświetlania klatek, co zapewnia płynniejsze odtwarzanie filmów.
- Obsługa lepszej jakości wyjścia wideo HDR na urządzeniach obsługujących tę funkcję.
- Obsługa bezpiecznych plików wyjściowych podczas odtwarzania treści chronionych mechanizmem DRM.
- Możliwość renderowania treści wideo w pełnej rozdzielczości na ekranie Urządzenia z Androidem TV, które ulepszają warstwę interfejsu użytkownika.
Dlatego tam, gdzie to możliwe, opcja SurfaceView
powinna być lepsza niż TextureView
.
Funkcji TextureView
należy używać tylko wtedy, gdy interfejs SurfaceView
nie spełnia Twoich wymagań. Jeden
Oto przykład, gdy wymagane są płynne animacje lub przewijanie powierzchni filmu.
przed Androidem 7.0 (poziom interfejsu API 24) zgodnie z opisem w tych uwagach. Dla:
w tym przypadku lepiej używać parametru TextureView
tylko wtedy, gdy wartość SDK_INT
jest mniejsza
niż 24 (Android 7.0) i SurfaceView
w innym przypadku.
Nawigacja za pomocą pada kierunkowego na Androidzie TV
Pilot Android TV ma panel sterujący, który wysyła polecenia jako zdarzenia klawisza w urządzeniu dispatchKeyEvent(KeyEvent)
. Te elementy muszą zostać przeniesione do widoku odtwarzacza:
override fun dispatchKeyEvent(event: KeyEvent?): Boolean{ return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event) }
@Override public boolean dispatchKeyEvent(KeyEvent event) { return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); }
Żądanie skupienia na widoku odtwarzacza jest ważne dla nawigacji przy użyciu elementów sterujących odtwarzaniem i pomijania reklam. Poproś o zaznaczenie tych elementów: onCreate
Activity
:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... playerView.requestFocus() // ... }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... playerView.requestFocus(); // ... }
Jeśli używasz Compose na Androidzie TV, musisz umożliwić skupienie na elemencie AndroidView
i przekazać zdarzenie, przekazując parametr modyfikatora do elementu AndroidView
:
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
Zastępuj elementy, które można przeciągać
PlayerView
używa PlayerControlView
do wyświetlania elementów sterujących odtwarzaniem i paska postępu. Elementy rysowane przez funkcję PlayerControlView
mogą:
zostaną zastąpione przez obiekty rysowalne o tych samych nazwach zdefiniowanych w aplikacji. Zobacz
w dokumentach Java PlayerControlView
, gdzie znajdziesz listę elementów sterujących, które
mogą być zastąpione.
Dalsze dostosowywanie
Jeśli wymagane jest dostosowanie bardziej niż opisane powyżej, programiści wdrażają własne komponenty UI zamiast dzięki modułowi interfejsu Media3.