แอปที่เล่นสื่อจำเป็นต้องมีคอมโพเนนต์อินเทอร์เฟซผู้ใช้เพื่อแสดงสื่อและ ซึ่งควบคุมการเล่น ไลบรารี Media3 มีโมดูล UI ที่มี คอมโพเนนต์ UI จำนวนมาก หากต้องการขึ้นอยู่กับโมดูล UI ให้เพิ่มข้อมูลต่อไปนี้ การพึ่งพา:
Kotlin
implementation("androidx.media3:media3-ui:1.4.1")
ดึงดูด
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
มี
คุณสามารถใช้แอตทริบิวต์เหล่านี้เพื่อปรับแต่งลักษณะการทำงานของมุมมองได้ เช่น
รวมถึงรูปลักษณ์ แอตทริบิวต์เหล่านี้ส่วนใหญ่มีตัวตั้งค่าที่เกี่ยวข้อง
ซึ่งสามารถใช้เพื่อกำหนดค่ามุมมองขณะรันไทม์
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
หรือไม่เช่นนั้น
การนำทางด้วย 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