توفّر Media3 رمز PlayerView
تلقائي يوفّر بعض
خيارات التخصيص. لإجراء أي تخصيص إضافي، يتعين على مطوري
التطبيقات تنفيذ مكونات واجهة المستخدم الخاصة بهم.
أفضل الممارسات
عند تنفيذ واجهة مستخدم وسائط ترتبط بواجهة Player
Media3 (على سبيل المثال
ExoPlayer
أو MediaController
أو تنفيذ Player
مخصّص)، ننصح التطبيقات باتّباع أفضل الممارسات هذه للحصول على أفضل تجربة لواجهة المستخدم.
زر التشغيل/الإيقاف المؤقت
لا يتطابق زر التشغيل والإيقاف المؤقت بشكل مباشر مع حالة المشغّل الفردي. على سبيل المثال، يجب أن يتمكن المستخدم من إعادة تشغيل التشغيل بعد انتهائه أو إخفاقه حتى لو لم يكن المشغل متوقفًا مؤقتًا.
لتبسيط عملية التنفيذ، توفّر Media3 طرق استخدام لتحديد
الزر الذي سيتم عرضه (Util.shouldShowPlayButton
) والتعامل مع ضغطات الأزرار
(Util.handlePlayPauseButtonAction
):
Kotlin
val shouldShowPlayButton: Boolean = Util.shouldShowPlayButton(player) playPauseButton.setImageDrawable(if (shouldShowPlayButton) playDrawable else pauseDrawable) playPauseButton.setOnClickListener { Util.handlePlayPauseButtonAction(player) }
Java
boolean shouldShowPlayButton = Util.shouldShowPlayButton(player); playPauseButton.setImageDrawable(shouldShowPlayButton ? playDrawable : pauseDrawable); playPauseButton.setOnClickListener(view -> Util.handlePlayPauseButtonAction(player));
الاستماع إلى تحديثات الحالة
يحتاج مكوّن واجهة المستخدم إلى إضافة Player.Listener
ليكون على علم بتغييرات الحالة التي تتطلب تحديث واجهة المستخدم المقابلة. يُرجى الاطّلاع على قسم
الاستماع إلى أحداث التشغيل لمعرفة التفاصيل.
قد يكون تحديث واجهة المستخدم مكلفًا، وكثيرًا ما تصل أحداث اللاعبين
معًا. لتجنّب إعادة تحميل واجهة المستخدم كثيرًا خلال فترة زمنية قصيرة، من الأفضل بشكل عام الاستماع إلى onEvents
فقط وتشغيل تحديثات واجهة المستخدم من هنا:
Kotlin
player.addListener(object : Player.Listener{ override fun onEvents(player: Player, events: Player.Events){ if (events.containsAny( Player.EVENT_PLAY_WHEN_READY_CHANGED, Player.EVENT_PLAYBACK_STATE_CHANGED, Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED)) { updatePlayPauseButton() } if (events.containsAny(Player.EVENT_REPEAT_MODE_CHANGED)) { updateRepeatModeButton() } } })
Java
player.addListener(new Player.Listener() { @Override public void onEvents(Player player, Player.Events events) { if (events.containsAny( Player.EVENT_PLAY_WHEN_READY_CHANGED, Player.EVENT_PLAYBACK_STATE_CHANGED, Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED)) { updatePlayPauseButton(); } if (events.containsAny(Player.EVENT_REPEAT_MODE_CHANGED)) { updateRepeatModeButton(); } } });
التعامل مع الأوامر المتاحة
في ما يلي عناصر واجهة المستخدم العامة التي قد تحتاج إلى العمل مع عمليات تنفيذ Player
مختلفة: يجب التحقّق من أوامر المشغّل المتاحة لعرض الأزرار أو إخفائها، وتجنّب استدعاء طرق غير متوافقة:
Kotlin
nextButton.isEnabled = player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT)
Java
nextButton.setEnabled(player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT));