Dodaj elementy sterujące odtwarzaniem w aplikacji

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ść:

KotlinGroovy
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:

KotlinJava
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:

KotlinJava
// 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_viewnone. 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:

KotlinJava
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:

KotlinJava
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.