Javafx 2 使用javafx播放视频时如何使用时间轴
我们正在使用JavaFXMediaPlayer来播放.mp4格式 我有时间线的问题,我的问题是如果我们点击时间线上的任何一点, 应该从那一点开始。为此,我使用了下面的代码Javafx 2 使用javafx播放视频时如何使用时间轴,javafx-2,Javafx 2,我们正在使用JavaFXMediaPlayer来播放.mp4格式 我有时间线的问题,我的问题是如果我们点击时间线上的任何一点, 应该从那一点开始。为此,我使用了下面的代码 timeSlider.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { mediaPlayer.seek(Duration.seconds(t
timeSlider.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
mediaPlayer.seek(Duration.seconds(timeSlider.getValue()));
}
});
timeSlider.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
mediaPlayer.seek(Duration.seconds(timeSlider.getValue());
}
});
但这并不正常。有谁能帮我解决上述问题吗
提前感谢Oracle提供了一个关于这方面的精彩教程 您可以在应用程序中看到教程播放器的运行 本教程包含有关合并玩家时间线的信息 下面是JavaFX视频播放器控件的屏幕截图,其中包含来自Ensemble的时间线 创建滑块以控制位置的步骤如下:
MediaView
并将其关联到MediaPlayer
滑块来控制时间
滑块的更改,并根据需要更新MediaPlayer
位置
MediaPlayer
当前时间的更改,并根据需要更新滑块
// Media player
MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL));
// Time label
Label timeLabel = new Label("Time: ");
timeLabel.setMinWidth(Control.USE_PREF_SIZE);
mediaBar.getChildren().add(timeLabel);
// Time slider
timeSlider = new Slider();
HBox.setHgrow(timeSlider, Priority.ALWAYS);
timeSlider.setMinWidth(50);
timeSlider.setMaxWidth(Double.MAX_VALUE);
timeSlider.valueProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov) {
if (timeSlider.isValueChanging()) {
// multiply duration by percentage calculated by slider position
if(duration!=null) {
mp.seek(duration.multiply(timeSlider.getValue() / 100.0));
}
updateValues();
}
}
});
....
protected void updateValues() {
if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) {
Platform.runLater(new Runnable() {
public void run() {
Duration currentTime = mp.getCurrentTime();
playTime.setText(formatTime(currentTime, duration));
timeSlider.setDisable(duration.isUnknown());
if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) {
timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0);
}
if (!volumeSlider.isValueChanging()) {
volumeSlider.setValue((int) Math.round(mp.getVolume() * 100));
}
}
});
}
}
...
mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
updateValues();
}
});
// and also invoke updateValues when the MediaPlayer is played, paused, etc.
//媒体播放器
MediaPlayer mp=新媒体播放器(新媒体(媒体URL));
//时间标签
标签timeLabel=新标签(“时间:”);
timeLabel.setMinWidth(控件。使用前缀大小);
mediaBar.getChildren().add(timeLabel);
//时间滑块
时间滑块=新滑块();
HBox.setHgrow(timeSlider,Priority.ALWAYS);
时间滑块设置最小宽度(50);
timeSlider.setMaxWidth(双倍最大值);
timeSlider.valueProperty().addListener(新的InvalizationListener()){
公共无效无效(可观察ov){
if(timeSlider.isValueChanging()){
//将持续时间乘以滑块位置计算的百分比
if(持续时间!=null){
mp.seek(duration.multiply(timeSlider.getValue()/100.0));
}
updateValue();
}
}
});
....
受保护的void updateValue(){
如果(播放时间!=null&&timeSlider!=null&&volumesslider!=null&&duration!=null){
Platform.runLater(新的Runnable(){
公开募捐{
持续时间currentTime=mp.getCurrentTime();
playTime.setText(formatTime(当前时间,持续时间));
timeSlider.setDisable(duration.isUnknown());
如果(!timeSlider.isDisabled()&&duration.greaterThan(duration.ZERO)&&!timeSlider.isValueChanging()){
timeSlider.setValue(currentTime.divide(duration.toMillis()*100.0);
}
如果(!volumeSlider.isValueChanging()){
volumeSlider.setValue((int)Math.round(mp.getVolume()*100));
}
}
});
}
}
...
mp.currentTimeProperty().addListener(新的ChangeListener()){
@凌驾
public void changed(observevalueOracle提供了一个很好的教程
您可以在应用程序中看到教程播放器的运行
本教程包含有关合并玩家时间线的信息
下面是JavaFX视频播放器控件的屏幕截图,其中包含来自Ensemble的时间线
创建滑块以控制位置的步骤如下:
创建MediaView
并将其关联到MediaPlayer
创建一个滑块来控制时间
收听对滑块的更改,并根据需要更新MediaPlayer
位置
收听对MediaPlayer
当前时间的更改,并根据需要更新滑块
示例中的一些特定于时间滑块的代码片段包括:
// Media player
MediaPlayer mp = new MediaPlayer(new Media(MEDIA_URL));
// Time label
Label timeLabel = new Label("Time: ");
timeLabel.setMinWidth(Control.USE_PREF_SIZE);
mediaBar.getChildren().add(timeLabel);
// Time slider
timeSlider = new Slider();
HBox.setHgrow(timeSlider, Priority.ALWAYS);
timeSlider.setMinWidth(50);
timeSlider.setMaxWidth(Double.MAX_VALUE);
timeSlider.valueProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov) {
if (timeSlider.isValueChanging()) {
// multiply duration by percentage calculated by slider position
if(duration!=null) {
mp.seek(duration.multiply(timeSlider.getValue() / 100.0));
}
updateValues();
}
}
});
....
protected void updateValues() {
if (playTime != null && timeSlider != null && volumeSlider != null && duration != null) {
Platform.runLater(new Runnable() {
public void run() {
Duration currentTime = mp.getCurrentTime();
playTime.setText(formatTime(currentTime, duration));
timeSlider.setDisable(duration.isUnknown());
if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO) && !timeSlider.isValueChanging()) {
timeSlider.setValue(currentTime.divide(duration).toMillis() * 100.0);
}
if (!volumeSlider.isValueChanging()) {
volumeSlider.setValue((int) Math.round(mp.getVolume() * 100));
}
}
});
}
}
...
mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
updateValues();
}
});
// and also invoke updateValues when the MediaPlayer is played, paused, etc.
//媒体播放器
MediaPlayer mp=新媒体播放器(新媒体(媒体URL));
//时间标签
标签timeLabel=新标签(“时间:”);
timeLabel.setMinWidth(控件。使用前缀大小);
mediaBar.getChildren().add(timeLabel);
//时间滑块
时间滑块=新滑块();
HBox.setHgrow(timeSlider,Priority.ALWAYS);
时间滑块设置最小宽度(50);
timeSlider.setMaxWidth(双倍最大值);
timeSlider.valueProperty().addListener(新的InvalizationListener()){
公共无效无效(可观察ov){
if(timeSlider.isValueChanging()){
//将持续时间乘以滑块位置计算的百分比
if(持续时间!=null){
mp.seek(duration.multiply(timeSlider.getValue()/100.0));
}
updateValue();
}
}
});
....
受保护的void updateValue(){
如果(播放时间!=null&&timeSlider!=null&&volumesslider!=null&&duration!=null){
Platform.runLater(新的Runnable(){
公开募捐{
持续时间currentTime=mp.getCurrentTime();
playTime.setText(formatTime(当前时间,持续时间));
timeSlider.setDisable(duration.isUnknown());
如果(!timeSlider.isDisabled()&&duration.greaterThan(duration.ZERO)&&!timeSlider.isValueChanging()){
timeSlider.setValue(currentTime.divide(duration.toMillis()*100.0);
}
如果(!volumeSlider.isValueChanging()){
volumeSlider.setValue((int)Math.round(mp.getVolume()*100));
}
}
});
}
}
...
mp.currentTimeProperty().addListener(新的ChangeListener()){
@凌驾
public void changed(ObservalEvalue在listener on slider value Invalization中您应该检查用户最近是否按下了鼠标按钮(例如,在最近100毫秒内)。Scala中的示例代码(翻译成Java相当简单):
val timeSlider=新滑块{
/**
*@return true,如果用户在最近的`t`ms内按下鼠标按钮
*/
def鼠标已按下
class YieldingSlider extends Slider
{
private long lastTimeMousePressed = 0;
public YieldingSlider()
{
addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>()
{
@Override
public void handle(final MouseEvent event)
{
lastTimeMousePressed = System.currentTimeMillis();
}
});
}
public boolean mouseWasPressedWithinLast(long t)
{
return (System.currentTimeMillis() - lastTimeMousePressed) <= t;
}
}