แอปที่เล่นสื่อจำเป็นต้องมีคอมโพเนนต์อินเทอร์เฟซผู้ใช้เพื่อแสดงสื่อและการควบคุมการเล่น ไลบรารี Media3 มีโมดูล UI ที่มีคอมโพเนนต์ UI หลายรายการ หากต้องการใช้โมดูล UI ให้เพิ่มข้อกําหนดต่อไปนี้
Kotlin
implementation("androidx.media3:media3-ui:1.4.1")
Groovy
implementation "androidx.media3:media3-ui:1.4.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
มีแอตทริบิวต์หลายรายการ คุณใช้แอตทริบิวต์เหล่านี้เพื่อปรับแต่งลักษณะการทํางานของมุมมอง รวมถึงรูปลักษณ์และความรู้สึกของมุมมองได้ แอตทริบิวต์เหล่านี้ส่วนใหญ่มีเมธอด setter ที่เกี่ยวข้อง ซึ่งสามารถใช้เพื่อปรับแต่งมุมมองขณะรันไทม์ Javadoc ของ PlayerView
จะแสดงแอตทริบิวต์และเมธอดตัวตั้งค่าเหล่านี้อย่างละเอียด
เมื่อประกาศมุมมองในไฟล์เลย์เอาต์แล้ว คุณจะค้นหามุมมองนั้นใน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 ที่ปรับขนาดเลเยอร์ UI
ดังนั้น ระบบจึงควรกำหนด 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(); // ... }
หากใช้ Compose ใน Android TV คุณต้องทำให้ AndroidView
มุ่งเน้นได้และมอบสิทธิ์เหตุการณ์โดยส่งพารามิเตอร์ตัวแก้ไขไปยัง AndroidView
ดังนี้
AndroidView(
modifier = modifier
.focusable()
.onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
factory = { playerView }
)
ลบล้างรูปภาพที่วาดได้
PlayerView
จะใช้ PlayerControlView
เพื่อแสดงตัวควบคุม
การเล่นและแถบความคืบหน้า เนื้อหาที่ถอนออกได้ที่มีชื่อเดียวกันในแอปพลิเคชันของคุณลบล้างเนื้อหาที่ถอนออกได้ที่ PlayerControlView
ใช้งานอยู่ ดูรายการทรัพยากรที่ถอนออกได้ของการควบคุมที่ลบล้างได้ใน Javadoc ของ PlayerControlView
การปรับแต่งเพิ่มเติม
หากจำเป็นต้องมีการปรับแต่งนอกเหนือจากที่อธิบายข้างต้น เราคาดว่านักพัฒนาแอปจะนำคอมโพเนนต์ UI ของตนเองมาใช้แทนการใช้คอมโพเนนต์ UI ของ Media3