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.1")
Odlotowe
implementation "androidx.media3:media3-ui:1.4.1"
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:
czyli projektom.
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 ulepszają warstwę interfejsu użytkownika.
Dlatego tam, gdzie to możliwe, opcja SurfaceView
powinna być lepsza niż TextureView
.
Typu 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.