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 zależeć od modułu interfejsu, dodaj ten fragment zależność:

Kotlin

implementation("androidx.media3:media3-ui:1.4.0")

Odlotowe

implementation "androidx.media3:media3-ui:1.4.0"

Najważniejszym elementem jest PlayerView, czyli widok do odtwarzania multimediów. PlayerView wyświetla filmy, obrazy, napisy i okładki albumów podczas odtwarzania. oraz elementy sterujące odtwarzaniem.

PlayerView udostępnia metodę setPlayer podłączania i odłączania (przez (null).

Widok odtwarzacza

Typu PlayerView można używać do odtwarzania filmów, obrazów i dźwięku. Renderowanie wideo i napisy w przypadku odtwarzania filmu, mapy bitowe do odtwarzania obrazu Mogą też wyświetlać grafikę dołączoną do metadanych w plikach audio. Możesz ją uwzględnić w plikach układu tak samo jak w przypadku każdego innego komponentu. Przykład: PlayerView może zostać dołączone do następującego kodu 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"/>

Ten fragment kodu pokazuje, że PlayerView udostępnia kilka . 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 odpowiedni element ustawiający Za pomocą tych metod można dostosowywać widok w czasie działania. 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:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}

Java

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

Kotlin

// 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()

Java

// 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 ustawić typ nawierzchni używany do odtwarzania filmów. Oprócz wartości spherical_gl_surface_view (która to specjalna wartość przy odtwarzaniu filmów sferycznych) oraz video_decoder_gl_surface_view (do renderowania wideo za pomocą rozszerzeń) mechanizmów renderowania), dozwolone wartości to surface_view, texture_view i none. Jeśli widok służy tylko do odtwarzania dźwięku, użyj parametru none, aby uniknąć konieczności: bo takie działanie może być kosztowne.

Jeśli widok dotyczy zwykłego odtwarzania filmów, surface_view lub texture_view należy użyć funkcji. SurfaceView ma wiele zalet w porównaniu z TextureView w kategorii Odtwarzanie filmu:

  • Znacznie mniejsza moc konsumpcja danych urządzenia.
  • Bardziej dokładny czas wczytywania klatek, co przekłada się na płynniejsze odtwarzanie filmu.
  • 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 ekranu Urządzenia z Androidem TV, które rozszerzają warstwę interfejsu użytkownika.

Dlatego w miarę możliwości 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 do Androida TV ma przycisk pada kierunkowego, który wysyła polecenia są uznawane za kluczowe zdarzenie (dispatchKeyEvent(KeyEvent) z Activity). Te należy przekazać do widoku odtwarzacza:

Kotlin

override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}

Java

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

Prośba o zaznaczenie widoku odtwarzacza jest ważna przy nawigacji po odtwarzaniu i pomijanie reklam. Poproś o zaznaczenie tych elementów: onCreate Activity:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}

Java

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

Jeśli używasz funkcji Utwórz na Androidzie TV, musisz skonfigurować AndroidView i przekazać zdarzenie, przekazując parametr modyfikujący do funkcji AndroidView odpowiednio:

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 odtwarzania elementów sterujących i paska postępu. Elementy rysowane przez funkcję PlayerControlView mogą: zostaną zastąpione przez obiekty rysowalne o tych samych nazwach zdefiniowanych w aplikacji. Zobacz PlayerControlView w języku Javadoc, 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 interfejsu, zamiast korzystać z tych dzięki modułowi interfejsu Media3.