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

Media3 एक डिफ़ॉल्ट PlayerView उपलब्ध कराता है, जो पसंद के मुताबिक बनाने के विकल्प. ऐप्लिकेशन को अपनी पसंद के मुताबिक बनाने के लिए, ऐप्लिकेशन डेवलपर को अपने यूआई कॉम्पोनेंट को लागू करना चाहिए.

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

मीडिया3 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));

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

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

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