• 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中的代码是另外启动线程执行的。因为它要非常频繁的调用以更新控件,所以使用多线程可以避免它影响主线程中视频的播放

  • 相关阅读:
    Linux显示2015年日历表
    Linux显示系统日期
    Dialogs 对话框
    grid 属性
    VS2010 fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 嵌入清单
    Perl Tk grid 布局
    Perl Tk pack布局示例
    Perl Tk grid布局管理器
    Perl DBI模块
    输入文本框模型
  • 原文地址:https://www.cnblogs.com/jiading/p/12354126.html
Copyright © 2020-2023  润新知