تخصيصات واجهة المستخدم

توفّر 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));