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

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

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

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(Player.COMMAND_SEEK_TO_NEXT)

Java

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

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

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

इन अपडेट को मैनेज करने का एक सामान्य तरीका यह है कि चुने गए ट्रैक (EVENT_TRACKS_CHANGED) में हुए किसी भी बदलाव के लिए Player.Listener.onEvents को सुनें. साथ ही, जब पहला वीडियो फ़्रेम रेंडर किया गया हो (EVENT_RENDERED_FIRST_FRAME), तब भी Player.Listener.onEvents को सुनें. इसके अलावा, जब कोई नई इमेज उपलब्ध हो, तब 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, 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.
}