แอปที่เล่นสื่อต้องใช้คอมโพเนนต์อินเทอร์เฟซผู้ใช้สำหรับแสดงสื่อและควบคุมการเล่น ไลบรารี 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
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 ที่โมดูล UI ของ Media3 มีให้