เพิ่มตัวควบคุมการเล่นลงในแอป

แอปที่เล่นสื่อจำเป็นต้องมีคอมโพเนนต์อินเทอร์เฟซผู้ใช้เพื่อแสดงสื่อและ ซึ่งควบคุมการเล่น ไลบรารี Media3 มีโมดูล UI ที่มี คอมโพเนนต์ UI จำนวนมาก หากต้องการขึ้นอยู่กับโมดูล UI ให้เพิ่มข้อมูลต่อไปนี้ การพึ่งพา:

Kotlin

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

ดึงดูด

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

องค์ประกอบที่สำคัญที่สุดคือ PlayerView ซึ่งเป็นมุมมองสำหรับการเล่นสื่อ PlayerView แสดงวิดีโอ รูปภาพ คำบรรยาย และปกอัลบั้มระหว่างการเล่น รวมถึงตัวควบคุมการเล่น

PlayerView มีเมธอด setPlayer ในการติดและถอดออก (โดย null) อินสแตนซ์ผู้เล่น

มุมมองโปรแกรมเล่น

PlayerView ใช้ได้กับทั้งการเล่นวิดีโอ รูปภาพ และเสียง แสดงผล วิดีโอและคำบรรยายในกรณีที่เป็นการเล่นวิดีโอ บิตแมปสำหรับการเล่นรูปภาพ และสามารถแสดงอาร์ตเวิร์กที่เป็นข้อมูลเมตาในไฟล์เสียงได้ ใส่ข้อมูลลงไป ในไฟล์เค้าโครงเช่นเดียวกับคอมโพเนนต์ UI อื่นๆ ตัวอย่างเช่น 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 มี คุณสามารถใช้แอตทริบิวต์เหล่านี้เพื่อปรับแต่งลักษณะการทำงานของมุมมองได้ เช่น รวมถึงรูปลักษณ์ แอตทริบิวต์เหล่านี้ส่วนใหญ่มีตัวตั้งค่าที่เกี่ยวข้อง ซึ่งสามารถใช้เพื่อกำหนดค่ามุมมองขณะรันไทม์ 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 (ซึ่ง เป็นค่าพิเศษสำหรับการเล่นวิดีโอแบบ 360 องศา) และ video_decoder_gl_surface_view (ซึ่งใช้สำหรับการแสดงผลวิดีโอโดยใช้ส่วนขยาย โหมดแสดงภาพ) ค่าที่อนุญาตคือ surface_view, texture_view และ none ถ้า มุมมองนี้มีไว้สำหรับการเล่นเสียงเท่านั้น ควรใช้ none เพื่อหลีกเลี่ยงการ ก็สร้างแพลตฟอร์มขึ้นมาได้ เนื่องจากการทำเช่นนั้นอาจมีค่าใช้จ่ายสูง

หากเป็นการดูสำหรับการเล่นวิดีโอตามปกติ ให้กด surface_view หรือ texture_view ที่ควรทราบ SurfaceView มีประโยชน์กว่า TextureView สำหรับ การเล่นวิดีโอ:

  • ใช้พลังงานน้อยลงอย่างมาก ในหลายๆ ด้าน อุปกรณ์
  • การจับเวลาเฟรมแม่นยำมากขึ้น ทำให้การเล่นวิดีโอลื่นไหลขึ้น
  • รองรับเอาต์พุตวิดีโอ HDR ที่มีคุณภาพสูงขึ้นในอุปกรณ์ที่รองรับ
  • รองรับเอาต์พุตที่ปลอดภัยเมื่อเล่นเนื้อหาที่ป้องกันด้วย DRM
  • ความสามารถในการแสดงเนื้อหาวิดีโอที่ความละเอียดเต็มของจอแสดงผลใน อุปกรณ์ Android TV ที่ทำให้เลเยอร์ UI มีคุณภาพสูงขึ้น

ดังนั้น ระบบจึงควรกำหนด SurfaceView มากกว่า TextureView หากทำได้ ควรใช้ TextureView ก็ต่อเมื่อ SurfaceView ไม่ตรงกับความต้องการของคุณ หนึ่ง ตัวอย่างเช่น จำเป็นต้องมีภาพเคลื่อนไหวหรือการเลื่อนแพลตฟอร์มวิดีโอที่ราบรื่น ก่อน Android 7.0 (API ระดับ 24) ตามที่อธิบายไว้ในหมายเหตุต่อไปนี้ สำหรับ ในกรณีนี้ คุณควรใช้ TextureView เฉพาะเมื่อ SDK_INT น้อยกว่า 24 (Android 7.0) และ SurfaceView หรือไม่เช่นนั้น

ของ Android

การนำทางด้วย 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();
    // ...
}

หากใช้ฟีเจอร์ Compose ใน Android TV คุณจะต้องทำการ AndroidView โฟกัสได้ และมอบสิทธิ์เหตุการณ์โดยการส่งพารามิเตอร์ตัวปรับแต่งไปยังฟังก์ชัน AndroidView ให้สอดคล้องกัน

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

ลบล้างเนื้อหาที่ถอนออกได้

PlayerView ใช้ PlayerControlView เพื่อแสดงการเล่น และแถบความคืบหน้า เนื้อหาที่ถอนออกได้ที่ PlayerControlView ใช้สามารถ ถูกลบล้างโดยเนื้อหาที่ถอนออกได้ที่มีชื่อเดียวกันในแอปพลิเคชันของคุณ โปรดดู Javadoc ของ PlayerControlView สำหรับรายการทรัพยากรที่ถอนออกสำหรับการควบคุมที่ สามารถลบล้างได้

การปรับแต่งเพิ่มเติม

หากจำเป็นต้องมีการปรับแต่งนอกเหนือจากที่อธิบายไว้ข้างต้น เราคาดว่าแอป นักพัฒนาซอฟต์แวร์จะนำคอมโพเนนต์ UI ของตนเองไปใช้แทนการใช้คอมโพเนนต์ที่มีให้ ด้วยโมดูล UI ของ Media3