
org.refcodes.graphical.ext.javafx.impls.FxFlipBookBuilderImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of refcodes-graphical-ext-javafx Show documentation
Show all versions of refcodes-graphical-ext-javafx Show documentation
Artifact with JavaFX based extensions of the refcodes-graphical artifact.
package org.refcodes.graphical.ext.javafx.impls;
import java.util.ArrayList;
import java.util.List;
import org.refcodes.component.LifeCycleStatus;
import org.refcodes.graphical.ext.javafx.FxFlipBookBuilder;
import javafx.animation.PauseTransition;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
public class FxFlipBookBuilderImpl extends ImageView implements FxFlipBookBuilder {
// /////////////////////////////////////////////////////////////////////////
// STATICS:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// CONSTANTS:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// VARIABLES:
// /////////////////////////////////////////////////////////////////////////
private List _startUpImages = new ArrayList();
private List _mainLoopImages = new ArrayList();
private List _ceaseImages = new ArrayList();
private LifeCycleStatus _lifeCycleRequest = LifeCycleStatus.NONE;
private LifeCycleStatus _lifeCycleStatus = LifeCycleStatus.INITIALIZED;
private int _imageDurationInMs = 250;
private int _startUpDelayInMs = 1000;
private PauseTransition _transition = null;
// /////////////////////////////////////////////////////////////////////////
// CONSTRUCTORS:
// /////////////////////////////////////////////////////////////////////////
public FxFlipBookBuilderImpl() {
setVisible( false );
}
// /////////////////////////////////////////////////////////////////////////
// BUILDERS:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// INJECTION:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// METHODS:
// /////////////////////////////////////////////////////////////////////////
@Override
public void addStartUpImage( Image aImage ) {
if ( _startUpImages.size() == 0 ) setImage( aImage );
_startUpImages.add( aImage );
}
@Override
public void addMainLoopImage( Image aImage ) {
if ( _mainLoopImages.size() == 0 && _startUpImages.size() == 0 ) setImage( aImage );
_mainLoopImages.add( aImage );
}
@Override
public void addCeaseImage( Image aImage ) {
if ( _ceaseImages.size() == 0 && _mainLoopImages.size() == 0 && _startUpImages.size() == 0 ) setImage( aImage );
_ceaseImages.add( aImage );
}
@Override
public void setImageDurationInMs( int aDurationInMs ) {
_imageDurationInMs = aDurationInMs;
}
@Override
public int getImageDurationInMs() {
return _imageDurationInMs;
}
@Override
public void setStartUpDelayInMs( int aStartUpDelayInMs ) {
_startUpDelayInMs = aStartUpDelayInMs;
}
@Override
public int getStartUpDelayInMs() {
return _startUpDelayInMs;
}
@Override
public FxFlipBookBuilderImpl withImageDurationInMs( int aDurationInMs ) {
setImageDurationInMs( aDurationInMs );
return this;
}
@Override
public FxFlipBookBuilderImpl withStartUpDelayInMs( int aStartUpDelayInMs ) {
setStartUpDelayInMs( aStartUpDelayInMs );
return this;
}
// /////////////////////////////////////////////////////////////////////////
// LIFE-CYCLE:
// /////////////////////////////////////////////////////////////////////////
@Override
public void initialize() {
_lifeCycleStatus = LifeCycleStatus.INITIALIZED;
}
@Override
public void start() {
if ( _lifeCycleStatus != LifeCycleStatus.INITIALIZED || _startUpImages.size() == 0 ) _lifeCycleStatus = LifeCycleStatus.STARTED;
if ( _transition != null ) throw new IllegalStateException( "The flip book must not be started again after it has been started but not stopped (destroyed) again" );
Runnable theRunner = new AnimationDaemon();
if ( Platform.isFxApplicationThread() ) {
theRunner.run();
}
else {
Platform.runLater( theRunner );
}
}
@Override
public void pause() {
_lifeCycleRequest = LifeCycleStatus.PAUSED;
}
@Override
public void resume() {
_lifeCycleRequest = LifeCycleStatus.STARTED;
}
@Override
public void stop() {
_lifeCycleRequest = LifeCycleStatus.STOPPED;
PauseTransition theTransition = _transition;
if ( theTransition != null ) {
_transition = null;
theTransition.stop();
}
}
@Override
public void cease() {
_lifeCycleRequest = LifeCycleStatus.CEASED;
}
@Override
public void destroy() {
stop();
_startUpImages.clear();
}
// /////////////////////////////////////////////////////////////////////////
// HOOKS:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// HELPER:
// /////////////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////////////
// INNER CLASSES:
// /////////////////////////////////////////////////////////////////////////
private class AnimationDaemon implements Runnable {
private int _index = 0;
@Override
public void run() {
_transition = new PauseTransition();
if ( _lifeCycleStatus != LifeCycleStatus.INITIALIZED || _startUpDelayInMs <= 0 ) {
flipImage();
_transition.setDuration( Duration.millis( _imageDurationInMs ) );
}
else {
_transition.setDuration( Duration.millis( _startUpDelayInMs ) );
}
_transition.setCycleCount( 1 );
_transition.play();
EventHandler onFinished = new EventHandler() {
public void handle( ActionEvent t ) {
flipImage();
PauseTransition theTransition = _transition;
if ( theTransition != null ) {
theTransition.setDuration( Duration.millis( _imageDurationInMs ) );
theTransition.play();
}
}
};
_transition.setOnFinished( onFinished );
}
private void flipImage() {
setVisible( true );
List theImages = null;
switch ( _lifeCycleStatus ) {
case CEASED:
theImages = _ceaseImages;
break;
case DESTROYED:
break;
case INITIALIZED:
theImages = _startUpImages;
if ( _index > theImages.size() - 1 ) {
_index = 0;
_lifeCycleStatus = LifeCycleStatus.STARTED;
_lifeCycleRequest = LifeCycleStatus.NONE;
theImages = _mainLoopImages;
}
break;
case NONE:
break;
case PAUSED:
break;
case STARTED:
theImages = _mainLoopImages;
break;
case STOPPED:
break;
default:
break;
}
switch ( _lifeCycleRequest ) {
case CEASED:
if ( _index > theImages.size() - 1 ) {
_index = 0;
_lifeCycleStatus = LifeCycleStatus.CEASED;
_lifeCycleRequest = LifeCycleStatus.NONE;
theImages = _ceaseImages;
}
break;
case DESTROYED:
break;
case INITIALIZED:
_index = 0;
_lifeCycleStatus = LifeCycleStatus.INITIALIZED;
_lifeCycleRequest = LifeCycleStatus.NONE;
theImages = _startUpImages;
break;
case NONE:
break;
case PAUSED:
return;
case STARTED:
break;
case STOPPED:
if ( _index > theImages.size() - 1 ) {
_index = 0;
_lifeCycleStatus = LifeCycleStatus.STOPPED;
_lifeCycleRequest = LifeCycleStatus.NONE;
}
return;
default:
break;
}
if ( theImages.size() > 0 ) {
if ( _index > theImages.size() - 1 ) _index = 0;
setImage( theImages.get( _index++ ) );
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy