Tuỳ chỉnh giao diện người dùng

Media3 cung cấp PlayerView mặc định để cung cấp một số tuỳ chọn tuỳ chỉnh. Để tuỳ chỉnh thêm, nhà phát triển ứng dụng dự kiến sẽ triển khai các thành phần trên giao diện người dùng của riêng họ.

Các phương pháp hay nhất

Khi triển khai giao diện người dùng nội dung đa phương tiện kết nối với một Player Media3 (ví dụ: ExoPlayer, MediaController hoặc phương thức triển khai Player tuỳ chỉnh), các ứng dụng nên làm theo các phương pháp hay nhất sau đây để có được trải nghiệm giao diện người dùng tốt nhất.

Nút phát/tạm dừng

Nút phát và tạm dừng không tương ứng trực tiếp với trạng thái của một trình phát. Ví dụ: người dùng vẫn có thể bắt đầu phát lại sau khi kết thúc hoặc không phát được ngay cả khi trình phát chưa tạm dừng.

Để đơn giản hoá quá trình triển khai, Media3 cung cấp các phương thức sử dụng để quyết định nút nào sẽ hiển thị (Util.shouldShowPlayButton) và xử lý các thao tác nhấn nút (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));

Nghe thông tin cập nhật về trạng thái

Thành phần giao diện người dùng cần thêm một Player.Listener để được thông báo về các thay đổi trạng thái cần cập nhật giao diện người dùng tương ứng. Hãy xem phần Nghe sự kiện phát để biết thông tin chi tiết.

Việc làm mới giao diện người dùng có thể tốn kém và nhiều sự kiện của người chơi thường xuất hiện cùng nhau. Để tránh làm mới giao diện người dùng quá thường xuyên trong khoảng thời gian ngắn, bạn chỉ nên nghe onEvents và kích hoạt bản cập nhật giao diện người dùng từ đó:

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();
    }
  }
});

Xử lý các lệnh hiện có

Một thành phần giao diện người dùng dùng chung có thể cần hoạt động với nhiều cách triển khai Player khác nhau nên kiểm tra các lệnh có sẵn của trình phát để hiện hoặc ẩn các nút, cũng như để tránh gọi các phương thức không được hỗ trợ:

Kotlin

nextButton.isEnabled = player.isCommandAvailable(Player.COMMAND_SEEK_TO_NEXT)

Java

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