แอปที่เล่นสื่อจำเป็นต้องมีคอมโพเนนต์อินเทอร์เฟซผู้ใช้เพื่อแสดงสื่อและ ซึ่งควบคุมการเล่น ไลบรารี Media3 มีโมดูล UI ที่มี คอมโพเนนต์ UI จำนวนหนึ่ง หากต้องการใช้โมดูล UI ให้เพิ่มข้อกําหนดต่อไปนี้
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
:
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
:
// 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
ในกรณีอื่นๆ
การนำทางด้วย D-pad บน Android TV
รีโมตคอนโทรลของ Android TV มีตัวควบคุม D-pad ที่ส่งคำสั่ง
เข้าเป็นเหตุการณ์สำคัญเวลา dispatchKeyEvent(KeyEvent)
ของActivity
คุณต้องมอบสิทธิ์ต่อไปนี้ให้กับมุมมองโปรแกรมเล่น
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
ดังนี้
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 มีให้