यूज़र इंटरफ़ेस (यूआई) को पसंद के मुताबिक बनाने की सेटिंग

Media3, डिफ़ॉल्ट रूप से PlayerView उपलब्ध कराता है. इसमें पसंद के मुताबिक बनाने के कुछ विकल्प मिलते हैं.

ड्रॉएबल को ओवरराइड करना

PlayerView, प्लेबैक कंट्रोल और प्रोग्रेस बार दिखाने के लिए PlayerControlView का इस्तेमाल करता है. PlayerControlView में इस्तेमाल किए गए ड्रॉएबल को, आपके ऐप्लिकेशन में तय किए गए समान नाम वाले ड्रॉएबल से बदला जा सकता है. ओवरराइड किए जा सकने वाले कंट्रोल ड्रॉएबल की सूची के लिए, PlayerControlView दस्तावेज़ देखें.

ऐप्लिकेशन में किसी भी तरह के बदलाव के लिए, ऐप्लिकेशन डेवलपर को अपने यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट लागू करने होंगे. हालांकि, यहां कुछ सबसे सही तरीके दिए गए हैं. इनकी मदद से, आपको शुरुआत करने में मदद मिल सकती है.

सबसे सही तरीके

Media3 Player से कनेक्ट होने वाले मीडिया यूज़र इंटरफ़ेस (यूआई) को लागू करते समय, ऐप्लिकेशन को सबसे सही तरीके अपनाने की सलाह दी जाती है. इससे यूज़र इंटरफ़ेस (यूआई) का सबसे अच्छा अनुभव मिलता है. उदाहरण के लिए, 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(COMMAND_SEEK_TO_NEXT)

Java

nextButton.setEnabled(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT));

पहले फ़्रेम का शटर और इमेज डिसप्ले

जब कोई यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, वीडियो या इमेज दिखाता है, तो आम तौर पर वह प्लेसहोल्डर शटर व्यू का इस्तेमाल करता है. ऐसा तब तक होता है, जब तक कि असल पहला फ़्रेम या इमेज उपलब्ध न हो जाए. इसके अलावा, वीडियो और इमेज को एक साथ चलाने के लिए, इमेज व्यू को सही समय पर छिपाना और दिखाना ज़रूरी है.

इन अपडेट को मैनेज करने का एक सामान्य तरीका यह है कि चुने गए ट्रैक (EVENT_TRACKS_CHANGED) में किसी भी बदलाव के लिए, Player.Listener.onEvents() को सुनें. साथ ही, पहला वीडियो फ़्रेम रेंडर होने (EVENT_RENDERED_FIRST_FRAME) और नई इमेज उपलब्ध होने पर, ImageOutput.onImageAvailable() को सुनें:

Kotlin

override fun onEvents(player: Player, events: Player.Events) {
  if (events.contains(Player.EVENT_TRACKS_CHANGED)) {
    // If no video or image track: show shutter, hide image view.
    // Otherwise: do nothing to wait for first frame or image.
  }
  if (events.contains(Player.EVENT_RENDERED_FIRST_FRAME)) {
    // Hide shutter, hide image view.
  }
}

override fun onImageAvailable(presentationTimeUs: Long, bitmap: Bitmap) {
  // Show shutter, set image and show image view.
}

Java

@Override
public void onEvents(Player player, Player.Events events) {
  if (events.contains(Player.EVENT_TRACKS_CHANGED)) {
    // If no video or image track: show shutter, hide image view.
    // Otherwise: do nothing to wait for first frame or image.
  }
  if (events.contains(Player.EVENT_RENDERED_FIRST_FRAME)) {
    // Hide shutter, hide image view.
  }
}

@Override
public void onImageAvailable(long presentationTimeUs, Bitmap bitmap) {
  // Show shutter, set image and show image view.
}