یک برنامه در حال پخش رسانه به اجزای رابط کاربری برای نمایش رسانه و کنترل پخش نیاز دارد. کتابخانه Media3 شامل یک ماژول UI است که شامل تعدادی مؤلفه رابط کاربری است. برای وابستگی به ماژول UI وابستگی زیر را اضافه کنید:
کاتلین
implementation("androidx.media3:media3-ui:1.4.1")
شیار
implementation "androidx.media3:media3-ui:1.4.1"
مهمترین مؤلفه PlayerView
است، نمایی برای پخش رسانهها. PlayerView
ویدیو، تصاویر، زیرنویسها و آلبوم هنری را در حین پخش و همچنین کنترلهای پخش را نمایش میدهد.
PlayerView
یک روش setPlayer
برای پیوست کردن و جدا کردن (با پاس کردن null
) نمونه های پخش کننده دارد.
PlayerView
PlayerView
می تواند برای پخش ویدئو، تصویر و صدا استفاده شود. این ویدئو و زیرنویس را در مورد پخش ویدئو، نقشه های بیتی برای پخش تصویر ارائه می کند و می تواند آثار هنری موجود به عنوان ابرداده در فایل های صوتی را نمایش دهد. می توانید آن را مانند هر مؤلفه رابط کاربری دیگری در فایل های طرح بندی خود قرار دهید. به عنوان مثال، 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 این ویژگی ها و روش های تنظیم کننده را با جزئیات بیشتری فهرست می کند.
هنگامی که نمای در فایل layout اعلام شد، می توان آن را در متد 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
به view متصل کرد:
کاتلین
// 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
(که یک مقدار ویژه برای پخش ویدیوی کروی است) و video_decoder_gl_surface_view
(که برای رندر ویدیو با استفاده از رندرهای افزونه است)، مقادیر مجاز عبارتند از surface_view
، texture_view
و none
. اگر نما فقط برای پخش صدا است، برای جلوگیری از ایجاد یک سطح نباید از none
استفاده کرد زیرا انجام این کار می تواند گران باشد.
اگر نما برای پخش معمولی ویدیو است، باید از surface_view
یا texture_view
استفاده شود. SurfaceView
مزایای زیادی نسبت به TextureView
برای پخش ویدیو دارد:
- مصرف برق به طور قابل توجهی در بسیاری از دستگاه ها کاهش می یابد .
- زمانبندی دقیقتر فریم، در نتیجه پخش فیلم روانتر میشود.
- پشتیبانی از خروجی ویدیوی HDR با کیفیت بالاتر در دستگاه های توانمند.
- پشتیبانی از خروجی ایمن هنگام پخش محتوای محافظت شده با DRM.
- توانایی ارائه محتوای ویدیویی با وضوح کامل نمایشگر در دستگاههای Android TV که لایه رابط کاربری را ارتقا میدهند.
بنابراین 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
استفاده میشوند، میتوانند توسط نقشههایی با همان نامهای تعریفشده در برنامه شما لغو شوند. برای لیستی از نقشه های کنترلی که می توان آنها را نادیده گرفت، به PlayerControlView
Javadoc مراجعه کنید.
سفارشی سازی بیشتر
در مواردی که سفارشیسازی فراتر از آنچه در بالا توضیح داده شد مورد نیاز است، انتظار داریم که توسعهدهندگان برنامه به جای استفاده از موارد ارائه شده توسط ماژول UI Media3، اجزای رابط کاربری خود را پیادهسازی کنند.