javafx視頻進度條的實現


javafx視頻進度條的實現

本文代碼參考於項目https://github.com/Al-assad/Simple-Media-Player

首先,我們假設有一個進度條和一個label來表示視頻時間

@FXML
    Slider processSD;
    @FXML
    Label timeLB;

我們首先需要在播放器創建的時候就注冊一個監聽器:

mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() {
            @Override
            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                updateTime();
            }
        });}

這個監聽器在每次系統時間變化都會被調用

private String formatTime(Duration elapsed, Duration duration) {
        //將兩個Duartion參數轉化為 hh:mm:ss的形式后輸出
        int intElapsed = (int) Math.floor(elapsed.toSeconds());
        int elapsedHours = intElapsed / (60 * 60);
        int elapsedMinutes = (intElapsed - elapsedHours * 60 * 60) / 60;
        int elapsedSeconds = intElapsed - elapsedHours * 60 * 60 - elapsedMinutes * 60;
        if (duration.greaterThan(Duration.ZERO)) {
            int intDuration = (int) Math.floor(duration.toSeconds());
            int durationHours = intDuration / (60 * 60);
            int durationMinutes = (intDuration - durationHours * 60 * 60) / 60;
            int durationSeconds = intDuration - durationHours * 60 * 60 - durationMinutes * 60;

            if (durationHours > 0) {
                return String.format("%02d:%02d:%02d / %02d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds, durationHours, durationMinutes, durationSeconds);
            } else {
                return String.format("%02d:%02d / %02d:%02d", elapsedMinutes, elapsedSeconds, durationMinutes, durationSeconds);
            }
        } else {
            if (elapsedHours > 0) {
                return String.format("%02d:%02d:%02d / %02d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds);
            } else {
                return String.format("%02d:%02d / %02d:%02d", elapsedMinutes, elapsedSeconds);
            }
        }
    }
public void updateTime() {
        if (processSD != null && timeLB != null && volumeSD != null && volumeBT != null) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    Duration currentTime = mediaPlayer.getCurrentTime();
                    timeLB.setText(formatTime(currentTime, duration));    //設置時間標簽
                    processSD.setDisable(duration.isUnknown());   //無法讀取時間是隱藏進度條
                    if (!processSD.isDisabled() && duration.greaterThan(Duration.ZERO) && !processSD.isValueChanging()) {
                        processSD.setValue(currentTime.toMillis() / duration.toMillis() * 100);   //設置進度條
                    }
                }
            });
        }
    }

這是對控件進行更新

這里用到了 Platform.runLater,這是什么呢?

來源:https://blog.csdn.net/u010061897/article/details/69358246

在 JavaFx 中,如果在非Fx線程要執行Fx線程相關的任務,必須在 Platform.runlater 中執行,
而 runlater 中代碼將不會阻塞當前線程

也就是說, Platform.runLater中的代碼是另外啟動線程執行的。因為它要非常頻繁的調用以更新控件,所以使用多線程可以避免它影響主線程中視頻的播放


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM