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

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

Kotlinดึงดูด
implementation("androidx.media3:media3-ui:1.5.1")
implementation "androidx.media3:media3-ui:1.5.1"

องค์ประกอบที่สําคัญที่สุดคือ 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 มี คุณสามารถใช้แอตทริบิวต์เหล่านี้เพื่อปรับแต่งลักษณะการทำงานของมุมมองได้ เช่น รวมถึงรูปลักษณ์ แอตทริบิวต์เหล่านี้ส่วนใหญ่มีตัวตั้งค่าที่เกี่ยวข้อง ซึ่งสามารถใช้เพื่อกำหนดค่ามุมมองขณะรันไทม์ Javadoc ของ PlayerView จะแสดงแอตทริบิวต์และเมธอดตัวตั้งค่าเหล่านี้อย่างละเอียด

เมื่อประกาศมุมมองในไฟล์เลย์เอาต์แล้ว สามารถค้นหามุมมองนั้นได้ใน วิธีการทำกิจกรรม onCreate:

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

เมื่อเริ่มต้นโปรแกรมเล่นแล้ว คุณจะสามารถแนบโปรแกรมเล่นกับมุมมองได้โดยการเรียกใช้ 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();

เลือกประเภทแพลตฟอร์ม

แอตทริบิวต์ 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 คุณต้องมอบสิทธิ์ต่อไปนี้ให้กับมุมมองโปรแกรมเล่น

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

การขอโฟกัสสำหรับมุมมองโปรแกรมเล่นเป็นสิ่งสำคัญสำหรับการไปยังส่วนต่างๆ ของการควบคุมการเล่นและการข้ามโฆษณา ลองขอโฟกัสใน 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();
    // ...
}

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

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

ลบล้างรูปภาพที่วาดได้

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

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

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