הוספה של רכיבי ה-UI להפעלה לאפליקציה

לאפליקציה שמפעילה מדיה נדרשים רכיבים בממשק המשתמש כדי להציג מדיה וגם לשלוט בהפעלה. ספריית Media3 כוללת מודול ממשק משתמש שמכיל מספר רכיבים של ממשק המשתמש. כדי להיות תלוי במודול ממשק המשתמש, צריך להוסיף את הפרטים הבאים של תלות:

Kotlin

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

מגניב

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

הרכיב החשוב ביותר הוא PlayerView – תצוגה להפעלות של מדיה. ב-PlayerView מוצגים סרטונים, תמונות, כתוביות ועטיפת אלבום במהלך הפעלת המשחק. וגם פקדי ההפעלה.

ב-PlayerView יש שיטת setPlayer לחיבור ולניתוק (על ידי העברת מופעים של הנגן null.

תצוגת נגן

אפשר להשתמש ב-PlayerView להפעלות של סרטונים, תמונות ואודיו. הוא יוצר תמונה וידאו וכתוביות למקרה של הפעלת סרטון, מפות סיביות להפעלת תמונה ויכול להציג גרפיקה שכלולה כמטא-נתונים בקובצי אודיו. אפשר לכלול אותו בקובצי הפריסה כמו כל רכיב אחר של ממשק המשתמש. לדוגמה, PlayerView אפשר לכלול ב-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"/>

קטע הקוד שלמעלה ממחיש ש-PlayerView מספק . ניתן להשתמש במאפיינים האלה כדי להתאים אישית את התנהגות התצוגה, כמו וגם המראה והתחושה שלו. לרוב המאפיינים האלה יש רכיב מגדיר תואם methods, שבהן אפשר להשתמש כדי להתאים אישית את התצוגה בזמן ריצה. PlayerView Javadoc מפרט את המאפיינים ואת השיטות המגדירות האלה ב- על שלושת הפיצ'רים האלה.

אחרי ההצהרה על התצוגה בקובץ הפריסה, אפשר לחפש אותה בקטע שיטת הפעילות onCreate:

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);
}

לאחר אתחול הנגן, אפשר לצרף אותו לתצוגה באמצעות קריאה לפעולה 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();

בחירת סוג הפלטפורמה

המאפיין surface_type של PlayerView מאפשר להגדיר את סוג הפלטפורמה משמש להפעלת סרטון. מלבד הערכים spherical_gl_surface_view (ש הוא ערך מיוחד להפעלה של סרטון כדורי) video_decoder_gl_surface_view (לרינדור וידאו באמצעות תוסף רינדור), הערכים המותרים הם surface_view, texture_view ו-none. אם המיקום התצוגה היא להפעלת אודיו בלבד, צריך להשתמש בnone כדי להימנע מצורך תיצור משטח, כי זה עלול להיות יקר.

אם הצפייה היא להפעלה רגילה של סרטון, surface_view או texture_view . ל-SurfaceView יש כמה יתרונות על פני TextureView למשך הפעלת סרטון:

  • הספק נמוך יותר באופן משמעותי צריכה מכשירים.
  • תזמון פריימים מדויק יותר, ולכן הפעלת סרטון חלקה יותר.
  • תמיכה בפלט וידאו באיכות HDR באיכות גבוהה יותר במכשירים מתאימים.
  • תמיכה בפלט מאובטח כשמפעילים תוכן המוגן באמצעות DRM.
  • היכולת לעבד תוכן וידאו ברזולוציה המלאה של המסך במכשיר מכשירי Android TV שמשפרים את שכבת ממשק המשתמש.

לכן, צריך לתת עדיפות ל-SurfaceView על פני TextureView כשהדבר אפשרי. צריך להשתמש באמצעי התשלום TextureView רק אם SurfaceView לא מתאים לצרכים שלך. אחת למשל, יש צורך באנימציות חלקות או בגלילה של פני השטח של הסרטון לפני Android 7.0 (רמת API 24), כפי שמתואר בהערות הבאות. עבור במקרה כזה, עדיף להשתמש במאפיין TextureView רק כאשר הערך של SDK_INT נמוך יותר מ-24 (Android 7.0) ו-SurfaceView אחרת.

ניווט באמצעות לחצני החיצים (D-pad) ב-Android TV

בשלט הרחוק של Android TV יש שלט רחוק בלחצני החיצים (D-pad) ששולח פקודות הגעה כאירוע מרכזי ב-dispatchKeyEvent(KeyEvent) מתוך Activity. האלה צריך לקבל גישה לתצוגת הנגן:

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);
}

כדי לנווט בהפעלה חשוב לבקש מיקוד בתצוגת הנגן שמדלגים על מודעות ומדלגים על מודעות. כדאי לבקש את המיקוד ב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();
    // ...
}

אם אתם משתמשים בתכונה 'כתיבה' ב-Android TV, עליכם ליצור את AndroidView שניתן להתמקד בו ולהאציל את האירוע על ידי העברה של פרמטר הצירוף אל AndroidView בהתאם:

AndroidView(
  modifier = modifier
    .focusable()
    .onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
  factory = { playerView }
)

שינוי של פריטים שניתן להזזה

כדי להציג את ההפעלה, PlayerView משתמש/ת ב-PlayerControlView אמצעי הבקרה וסרגל ההתקדמות. הפריטים הנשלפים שמשמשים את PlayerControlView יכולים ניתנים להחלפה על ידי פריטים בעלי שמות זהים שמוגדרים באפליקציה. צפייה במסמך Javadoc PlayerControlView לרשימה של פריטים שניתן לצייר עליהם ניתן לשינוי.

התאמה אישית נוספת

במקרים שבהם נדרשת התאמה אישית מעבר למתואר למעלה, אנחנו מצפים שהאפליקציה מפתחים יוכלו להטמיע את רכיבי ממשק המשתמש שלהם במקום להשתמש ברכיבים באמצעות מודול ממשק המשתמש של Media3.