Example usage for com.badlogic.gdx.math Interpolation sine

List of usage examples for com.badlogic.gdx.math Interpolation sine

Introduction

In this page you can find the example usage for com.badlogic.gdx.math Interpolation sine.

Prototype

Interpolation sine

To view the source code for com.badlogic.gdx.math Interpolation sine.

Click Source Link

Usage

From source file:com.ixeption.libgdx.transitions.FadingGame.java

License:Apache License

@Override
public void create() {
    this.currentScreenFBO = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(),
            Gdx.graphics.getHeight(), false);
    this.nextScreenFBO = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(),
            Gdx.graphics.getHeight(), false);
    batch = new SpriteBatch();
    colorFadeInTransition = new ColorFadeTransition(Color.BLACK, Interpolation.sine);
}

From source file:com.vlaaad.dice.game.world.view.visualizers.BeamVisualizer.java

License:Open Source License

@Override
public IFuture<Void> visualize(ITargetOwner result) {
    final Future<Void> future = new Future<Void>();
    SoundManager.instance.playSoundIfExists(soundName);
    Image image = new Image(Config.skin, "effect-luck-image");
    image.setColor(color);//from www . jav a  2 s.  c om
    image.setScale(0, 0);
    image.setOrigin(image.getWidth() / 2, image.getHeight() / 2);
    image.setPosition(
            result.getTarget().getX() * ViewController.CELL_SIZE
                    + (ViewController.CELL_SIZE - image.getWidth()) * 0.5f,
            result.getTarget().getY() * ViewController.CELL_SIZE
                    + (ViewController.CELL_SIZE - image.getHeight()) * 0.5f + 6);
    visualizer.viewController.effectLayer.addActor(image);
    image.addAction(Actions.sequence(
            Actions.parallel(Actions.scaleTo(0.75f, 0.75f, 0.5f, Interpolation.sine),
                    Actions.rotateBy(135, 0.5f)),
            Actions.parallel(Actions.scaleTo(0, 0, 0.5f, Interpolation.sine), Actions.rotateBy(135, 0.5f)),
            Actions.run(future), Actions.removeActor()));
    return future;
}

From source file:com.vlaaad.dice.states.GameMapState.java

License:Open Source License

@SuppressWarnings("unchecked")
private void addGameServicesButtons() {
    final Table table = new Table(Config.skin);
    table.setFillParent(true);/*from w ww . j  a  va2s . c  o  m*/
    table.bottom().left();
    final Table content = new Table();
    content.left();
    table.add(content).expandX().fillX().height(22);
    stage.addActor(table);
    Config.mobileApi.services().dispatcher().addListener(new IStateDispatcher.Listener<ServicesState>() {
        final Ref<ActorGestureListener> listenerVar = new Ref<ActorGestureListener>();
        final Table iconContainer = new Table();
        boolean isShown;

        @Override
        public void onChangedState(ServicesState newState) {
            content.clearChildren();
            if (newState == ServicesState.CONNECTED) {
                Group servicesButton = new Group();
                Image image = new Image(Config.skin, "ui/button/services-up");
                final Image notification = new Image();
                notification.setScaling(Scaling.none);
                notification.setPosition(image.getWidth() - 1, image.getHeight() - 4);
                final Group arrow = new Group();
                final Tile arrowUp = new Tile("ui/button/arrow-hide");
                final Tile arrowDown = new Tile("ui/button/arrow-show");
                image.setPosition(2, -1);
                arrowDown.getColor().a = 0;
                arrow.addActor(arrowUp);
                arrow.addActor(arrowDown);
                arrow.setSize(arrowUp.getWidth(), arrowUp.getHeight());
                arrow.setOrigin(arrow.getWidth() / 2, arrow.getHeight() / 2);
                servicesButton.setSize(image.getWidth() + 1 + arrow.getWidth(), image.getHeight());
                servicesButton.addActor(image);
                servicesButton.addActor(arrow);
                servicesButton.addActor(notification);
                arrow.setPosition(image.getWidth() + 1, image.getHeight() / 2 - arrow.getHeight() / 2);
                content.add(servicesButton);

                stage.getRoot().addActorBefore(table, iconContainer);
                iconContainer.clearChildren();
                iconContainer.bottom().setFillParent(true);
                Table icons = new Table(Config.skin);
                icons.left().setBackground(
                        Config.skin.newDrawable("particle-white-pixel", new Color(0, 0, 0, 0.25f)));
                icons.defaults().padBottom(-2);
                iconContainer.add(icons).expandX().fillX().height(22);
                icons.add().width(servicesButton.getWidth()).padRight(2);
                iconContainer.setY(-22);
                listenerVar.set(new ActorGestureListener() {
                    @Override
                    public void tap(InputEvent event, float x, float y, int count, int button) {
                        notification.setDrawable(null);
                        iconContainer.clearActions();
                        arrowUp.clearActions();
                        arrowDown.clearActions();
                        isShown = !isShown;
                        Config.preferences.setServicesPaneShownByDefault(isShown);
                        arrow.addAction(Actions.rotateBy(180, 0.25f, Interpolation.pow3Out));
                        if (isShown) {
                            arrowDown.addAction(Actions.alpha(1, 0.25f, Interpolation.pow3Out));
                            arrowUp.addAction(Actions.alpha(0, 0.25f, Interpolation.pow3Out));
                            iconContainer.addAction(Actions.moveTo(0, 0, 0.25f, Interpolation.pow3Out));
                        } else {
                            arrowDown.addAction(Actions.alpha(0, 0.25f, Interpolation.pow3Out));
                            arrowUp.addAction(Actions.alpha(1, 0.25f, Interpolation.pow3Out));
                            iconContainer.addAction(Actions.moveTo(0, -22, 0.25f, Interpolation.pow3Out));
                        }
                    }
                });
                servicesButton.addListener(listenerVar.get());
                final Cell conflictCell = icons.add();
                final Cell inviteCell = icons.add();

                Button achievements = new Button(Config.skin, "achievements");
                achievements.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        Config.mobileApi.services().gameAchievements().showAchievements();
                    }
                });
                icons.add(achievements).padLeft(4);

                Button leaderboards = new Button(Config.skin, "leaderboards");
                leaderboards.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        Config.mobileApi.services().showLeaderboard("CgkIsNnQ2ZcKEAIQFw");
                    }
                });
                icons.add(leaderboards).padLeft(4);

                Button signOut = new Button(Config.skin, "sign-out");
                signOut.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        Config.mobileApi.services().signOut();
                    }
                });
                icons.add(signOut).expandX().right().padRight(2);

                final Button conflict = new Button(Config.skin, "conflict");
                conflict.addAction(Actions.forever(
                        Actions.sequence(Actions.color(Color.valueOf("eb653c"), 0.5f, Interpolation.sine),
                                Actions.color(Color.WHITE, 0.5f, Interpolation.sine))));
                conflict.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        new ConflictWindow().show(new ConflictWindow.Params(userData,
                                UserData.deserialize(callback.getConflictServerData()),
                                new ConflictWindow.Callback() {
                                    @Override
                                    public void onResult(ConflictResolution conflictResolution) {
                                        callback.resolveConflictingState(conflictResolution);
                                    }
                                }));
                    }
                });
                final Button invitesButton = new Button(Config.skin, "invite");
                invitesButton.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        new BlockingWindow()
                                .show(Config.mobileApi.services().multiplayer().displayInvitations());
                    }
                });
                invitesButton.setColor(Color.GREEN);

                Config.mobileApi.services().multiplayer().invites()
                        .addListener(new IStateDispatcher.Listener<Integer>() {
                            @Override
                            public void onChangedState(Integer invites) {
                                //                            Logger.debug("invites count: " + invites);
                                if (invites > 0) {
                                    if (!isShown) {
                                        notification
                                                .setDrawable(Config.skin.getDrawable("ui/button/notification"));
                                    }
                                    inviteCell.padLeft(4);
                                    inviteCell.setActor(invitesButton);
                                } else {
                                    inviteCell.padRight(0);
                                    inviteCell.setActor(null);
                                }
                            }
                        }, true);

                callback.dispatcher()
                        .addListener(new IStateDispatcher.Listener<ConflictResolver.ResolverState>() {
                            @Override
                            public void onChangedState(ConflictResolver.ResolverState newState) {
                                if (newState == ConflictResolver.ResolverState.hasConflict) {
                                    if (!isShown) {
                                        notification
                                                .setDrawable(Config.skin.getDrawable("ui/button/notification"));
                                    }
                                    conflictCell.padLeft(4);
                                    conflictCell.setActor(conflict);
                                } else {
                                    conflictCell.padRight(0);
                                    conflictCell.setActor(null);
                                }
                            }
                        }, true);

                if (!isShown && Config.preferences.isServicesPaneShownByDefault()) {
                    listenerVar.get().tap(null, 0, 0, 0, 0);
                }
            } else {
                Button signIn = new Button(Config.skin, "services-sign-in");
                signIn.addListener(new ChangeListener() {
                    @Override
                    public void changed(ChangeEvent event, Actor actor) {
                        Config.mobileApi.services().signIn();
                    }
                });
                content.add(signIn).left().padBottom(-4).padLeft(1);
                if (isShown && listenerVar.get() != null) {
                    listenerVar.get().tap(null, 0, 0, 0, 0);
                    Config.preferences.setServicesPaneShownByDefault(true);
                    listenerVar.clear();
                }
            }
        }
    }, true);
}

From source file:fr.plafogaj.screens.MainMenu.java

License:Open Source License

public void animateTable() {
    m_mainTable.addAction(Actions.sequence(Actions.alpha(0), Actions.delay(0.2f),
            Actions.fadeIn(0.3f, Interpolation.sine), Actions.delay(0.4f),
            Actions.moveTo(-BananaKnight.WIDTH / 2 + 160, m_mainTable.getY(), 0.6f, Interpolation.swing),
            Actions.run(new Runnable() {
                @Override//from w  w  w. j av  a2  s . c  o m
                public void run() {
                    m_playButton.setChecked(true);
                    m_levelCollapsible.setCollapsed(false);
                }
            })));
}

From source file:headmade.arttag.actions.ActionFactory.java

License:Apache License

public static RepeatAction wiggleRepeat(Float rotationAmount, Float duration) {
    final RepeatAction wiggleAction = Actions
            .forever(Actions.sequence(Actions.rotateBy(rotationAmount, duration / 4, Interpolation.sineOut),
                    Actions.rotateBy(-rotationAmount * 2, duration / 2, Interpolation.sine),
                    Actions.rotateBy(rotationAmount, duration / 4, Interpolation.sineIn)));
    return wiggleAction;
}

From source file:io.github.sandeel.SplashScreen.java

License:Open Source License

public SplashScreen() {
    this.complete = false;

    // create the logo
    Texture splashTexture = new Texture(Gdx.files.internal("splash.png"));
    splashImage = new Image(splashTexture);
    splashImage.addAction(Actions.fadeOut(0.0f));
    splashImage.addAction(Actions.sequence(Actions.delay(0.2f), Actions.fadeIn(5f, Interpolation.sine)));
    stage.addActor(splashImage);//from   w ww .j a  va2 s  . c o  m

    // time x seconds
    timer = new GameTimer(5000);
    timer.start();

    Music music = MyAssetManager.getInstance().get("audio/music/splash.ogg", Music.class);
    music.play();
}

From source file:mobi.shad.s3lib.gfx.node.filter.FxTextureGalleryMask.java

License:Apache License

/**
 *
 *//*from   ww  w  .  j av a  2  s.c o m*/
@Override
protected void processLocal() {
    if (formGui != null) {

        actionTime = formGui.getFloat("actionTime");
        pauseTime = formGui.getFloat("pauseTime");
        filesList = formGui.getArrayString("imageList");

        filesList = formGui.getArrayString("imageList");
        maskTextureName = formGui.getString("imageMask");

        interpolationMode = formGui.getInt("interpolationMode");

        switch (interpolationMode) {
        default:
            interpolation = Interpolation.linear;
            break;
        case 1:
            interpolation = Interpolation.bounce;
            break;
        case 2:
            interpolation = Interpolation.pow2;
            break;
        case 3:
            interpolation = Interpolation.pow3;
            break;
        case 4:
            interpolation = Interpolation.elastic;
            break;
        case 5:
            interpolation = Interpolation.swing;
            break;
        case 6:
            interpolation = Interpolation.sine;
            break;
        }

        data.type = Data.Type.EFFECT_2D;

        maskTexture = S3ResourceManager.getPixmap(maskTextureName, S3Constans.textureImageSizeHight);

        if (filesList != null) {
            if (filesList.length > 1) {
                srcTexture = S3ResourceManager.getPixmap(filesList[0], S3Constans.textureImageSizeHight);
                src2Texture = S3ResourceManager.getPixmap(filesList[1], S3Constans.textureImageSizeHight);
            } else {
                srcTexture = new Pixmap(S3Constans.textureImageSizeLow, S3Constans.textureImageSizeLow,
                        Format.RGBA8888);
                srcTexture.setColor(Color.CLEAR);
                srcTexture.fill();
                if (filesList.length > 0) {
                    src2Texture = S3ResourceManager.getPixmap(filesList[0], S3Constans.textureImageSizeHight);
                } else {
                    src2Texture = new Pixmap(S3Constans.textureImageSizeLow, S3Constans.textureImageSizeLow,
                            Format.RGBA8888);
                    src2Texture.setColor(Color.CLEAR);
                    src2Texture.fill();
                }
            }
        } else {
            srcTexture = new Pixmap(S3Constans.textureImageSizeLow, S3Constans.textureImageSizeLow,
                    Format.RGBA8888);
            srcTexture.setColor(Color.CLEAR);
            srcTexture.fill();

            src2Texture = new Pixmap(srcTexture.getWidth(), srcTexture.getHeight(), srcTexture.getFormat());
            src2Texture.setColor(Color.CLEAR);
            src2Texture.fill();
        }

        if (data.pixmap == null) {
            data.pixmap = new Pixmap(S3Constans.textureImageSizeHight, S3Constans.textureImageSizeHight,
                    Pixmap.Format.RGBA8888);
            data.pixmap.setColor(Color.CLEAR);
            data.pixmap.fill();
            data.textureChange = true;
        }

        clearPixmap = new Pixmap(S3Constans.textureImageSizeLow, S3Constans.textureImageSizeLow,
                Format.RGBA8888);
        clearPixmap.setColor(Color.CLEAR);
        clearPixmap.fill();

        pixmapFilter.setPixmap(data.pixmap, srcTexture, src2Texture, maskTexture);
    }
    currentActionTime = 0;
    currentPauseTime = 0;
    currentImageIdx = 0;
}

From source file:mobi.shad.s3lib.gfx.node.util.FxPixmapToAnimSprite.java

License:Apache License

/**
 *
 *//*from  www . j  ava2 s.  co m*/
@Override
protected void processLocal() {
    if (formGui != null) {

        speedSizeX = formGui.getFloat("speedSizeX") * S3Screen.aspectRatioX;
        speedSizeY = formGui.getFloat("speedSizeY") * S3Screen.aspectRatioY;

        startSizeX = formGui.getFloat("startSizeX") * S3Screen.aspectRatioX;
        startSizeY = formGui.getFloat("startSizeY") * S3Screen.aspectRatioY;

        amplitudeSizeX = formGui.getFloat("amplitudeSizeX") * S3Screen.aspectRatioX;
        amplitudeSizeY = formGui.getFloat("amplitudeSizeY") * S3Screen.aspectRatioY;

        speedPositionX = formGui.getFloat("speedPositionX") * S3Screen.aspectRatioX;
        speedPositionY = formGui.getFloat("speedPositionY") * S3Screen.aspectRatioY;

        amplitudePositionX = formGui.getFloat("amplitudePositionX") * S3Screen.aspectRatioX;
        amplitudePositionY = formGui.getFloat("amplitudePositionY") * S3Screen.aspectRatioY;

        transformMode = formGui.getInt("transformMode");
        interpolationMode = formGui.getInt("interpolationMode");

        switch (interpolationMode) {
        default:
            interpolation = Interpolation.linear;
            break;
        case 1:
            interpolation = Interpolation.bounce;
            break;
        case 2:
            interpolation = Interpolation.pow2;
            break;
        case 3:
            interpolation = Interpolation.pow3;
            break;
        case 4:
            interpolation = Interpolation.elastic;
            break;
        case 5:
            interpolation = Interpolation.swing;
            break;
        case 6:
            interpolation = Interpolation.sine;
            break;
        case 7:
            interpolation = Interpolation.bounceIn;
            break;
        case 8:
            interpolation = Interpolation.bounceOut;
            break;
        }
        fileTextureName = formGui.getString("FxTextureLoaderFile");

    }
    if (data.pixmap == null) {
        return;
    }

    data.spriteTexture = S3ResourceManager.getTexture(fileTextureName, 32);
    updateLocal(0, 0, 0, 0, false);
}

From source file:net.mwplay.cocostudio.ui.CocoStudioUIEditor.java

License:Apache License

/**
 * ??//  w ww . j  a v  a  2  s  . co m
 */
public Interpolation getInterpolation(int tweenType) {
    switch (tweenType) {
    case 0:
        return Interpolation.linear;
    case 1:
        return Interpolation.sineIn;
    case 2:
        return Interpolation.sineOut;
    case 3:
        return Interpolation.sine;
    case 4:
        return Interpolation.linear; //??Quad_EaseIn
    case 5:
        return Interpolation.linear; //??Quad_EaseOut
    case 6:
        return Interpolation.linear; //??Quad_EaseInOut
    case 7:
        return Interpolation.linear; //??Cubic_EaseIn
    case 8:
        return Interpolation.linear; //??Cubic_EaseOut
    case 9:
        return Interpolation.linear; //??Cubic_EaseInOut
    case 10:
        return Interpolation.linear; //??Quart_EaseIn
    case 11:
        return Interpolation.linear; //??Quart_EaseOut
    case 12:
        return Interpolation.linear; //??Quart_EaseInOut
    case 13:
        return Interpolation.linear; //??Quint_EaseIn
    case 14:
        return Interpolation.linear; //??Quint_EaseOut
    case 15:
        return Interpolation.linear; //??Quint_EaseInOut
    case 16:
        return Interpolation.exp10In;
    case 17:
        return Interpolation.exp10Out;
    case 18:
        return Interpolation.exp10;
    case 19:
        return Interpolation.circleIn;
    case 20:
        return Interpolation.circleOut;
    case 21:
        return Interpolation.circle;
    case 22:
        return Interpolation.elasticIn;
    case 23:
        return Interpolation.elasticOut;
    case 24:
        return Interpolation.elastic;
    case 25:
        return Interpolation.linear; //??Back_EaseIn
    case 26:
        return Interpolation.linear; //??Back_EaseOut
    case 27:
        return Interpolation.linear; //??Back_EaseInOut
    case 28:
        return Interpolation.bounceIn;
    case 29:
        return Interpolation.bounceOut;
    case 30:
        return Interpolation.bounce;

    default:
        return Interpolation.linear;
    }
}

From source file:net.spookygames.gdx.sfx.demo.GdxSfxDemo.java

License:Open Source License

@Override
public void create() {

    /******************/
    /* Initialization */
    /******************/

    prefs = Gdx.app.getPreferences("GdxSfxDemo");

    batch = new SpriteBatch();

    Camera camera = new OrthographicCamera();

    FileHandleResolver resolver = new AbsoluteFileHandleResolver();
    assetManager = new AssetManager(resolver);
    assetManager.setLoader(SfxMusic.class, new SfxMusicLoader(resolver));

    skin = new Skin(Gdx.files.internal("skin/uiskin.json"));

    player = new SfxMusicPlayer();

    /************/
    /* Playlist */
    /************/

    final VerticalGroup playlistGroup = new VerticalGroup();
    playlistGroup.fill().left();//from   w w  w . j av  a2 s. co  m

    final Label invitationLabel = new Label("Add some music and let's have fun", skin, "subtitle");
    invitationLabel.setAlignment(Align.center);

    ScrollPane scrollablePlaylistTable = new ScrollPane(playlistGroup, skin);
    scrollablePlaylistTable.setScrollingDisabled(true, false);

    playlistGroup.addActor(invitationLabel);

    /********/
    /* File */
    /********/

    Button fileFinder = new TextButton("Add music", skin, "round");
    fileFinder.addListener(new ChangeListener() {

        @Override
        public void changed(ChangeEvent event, Actor actor) {

            NativeFileChooserConfiguration conf = new NativeFileChooserConfiguration();
            conf.directory = Gdx.files.absolute(prefs.getString("last",
                    Gdx.files.isExternalStorageAvailable() ? Gdx.files.getExternalStoragePath()
                            : (Gdx.files.isLocalStorageAvailable() ? Gdx.files.getLocalStoragePath()
                                    : System.getProperty("user.home"))));
            conf.nameFilter = new FilenameFilter() {
                final String[] extensions = { "wav", "mp3", "ogg" };

                @Override
                public boolean accept(File dir, String name) {
                    int i = name.lastIndexOf('.');
                    if (i > 0 && i < name.length() - 1) {
                        String desiredExtension = name.substring(i + 1).toLowerCase(Locale.ENGLISH);
                        for (String extension : extensions) {
                            if (desiredExtension.equals(extension)) {
                                return true;
                            }
                        }
                    }
                    return false;
                }
            };
            conf.mimeFilter = "audio/*";
            conf.title = "Choose audio file";

            fileChooser.chooseFile(conf, new NativeFileChooserCallback() {
                @Override
                public void onFileChosen(FileHandle file) {
                    if (file == null)
                        return;

                    prefs.putString("last", file.parent().file().getAbsolutePath());
                    MusicParameters parameters = new MusicParameters();
                    parameters.title = file.name();
                    parameters.loadedCallback = new LoadedCallback() {
                        @Override
                        public void finishedLoading(AssetManager assetManager, String fileName,
                                @SuppressWarnings("rawtypes") Class type) {
                            final SfxMusic music = assetManager.get(fileName, SfxMusic.class);
                            if (player.addToPlaylist(music)) {
                                final MusicWidget widget = new MusicWidget(skin, music);
                                playlistGroup.addActor(widget);
                                widget.removeButton.addListener(new ChangeListener() {
                                    @Override
                                    public void changed(ChangeEvent event, Actor actor) {
                                        if (player.removeFromPlaylist(music))
                                            widget.remove();
                                    }
                                });
                            }
                        }
                    };

                    assetManager.load(new AssetDescriptor<SfxMusic>(file, SfxMusic.class, parameters));
                }

                @Override
                public void onCancellation() {
                }

                @Override
                public void onError(Exception exception) {
                }
            });
        }
    });

    /***********/
    /* Control */
    /***********/

    Table controlTable = new Table(skin);

    final Button playPauseButton = new Button(skin, "music");
    playPauseButton.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            if (playPauseButton.isChecked()) {
                player.play();
            } else {
                player.pause();
            }
        }
    });

    Button previousButton = new Button(skin, "left");
    previousButton.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.previous();
        }
    });

    Button nextButton = new Button(skin, "right");
    nextButton.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.next();
        }
    });

    final Button muteButton = new Button(skin, "sound");
    muteButton.setChecked(true);
    muteButton.addListener(new ChangeListener() {
        float formerVolume = player.getVolume();

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            float newVolume;
            if (muteButton.isChecked()) {
                // Un-mute
                newVolume = formerVolume;
            } else {
                // Mute
                formerVolume = player.getVolume();
                newVolume = 0f;
            }
            player.setVolume(newVolume);
        }
    });

    final Slider panSlider = new Slider(-1f, 1f, 0.02f, false, skin);
    panSlider.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.setPan(panSlider.getValue());
        }
    });
    panSlider.setValue(player.getPan());

    final Slider volumeSlider = new Slider(0f, 1f, 0.01f, false, skin);
    volumeSlider.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            muteButton.setChecked(true);
            player.setVolume(volumeSlider.getValue());
        }
    });
    volumeSlider.setValue(player.getVolume());

    final CheckBox shuffleCheckBox = new CheckBox("Shuffle", skin, "switch");
    shuffleCheckBox.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.setShuffleEnabled(shuffleCheckBox.isChecked());
        }
    });
    shuffleCheckBox.setChecked(player.isShuffleEnabled());

    final CheckBox repeatCheckBox = new CheckBox("Repeat", skin, "switch");
    repeatCheckBox.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.setRepeatEnabled(repeatCheckBox.isChecked());
        }
    });
    repeatCheckBox.setChecked(player.isRepeatEnabled());

    final Table fadeTable = new Table(skin);

    final Label fadeDurationLabel = new Label("0.0s", skin);
    final Slider fadeDurationSlider = new Slider(0.1f, 5f, 0.1f, false, skin);
    fadeDurationSlider.addListener(new ChangeListener() {
        String format = "%.1fs";

        @Override
        public void changed(ChangeEvent event, Actor actor) {
            float value = fadeDurationSlider.getValue();
            player.setFadeDuration(value);
            fadeDurationLabel.setText(String.format(format, value));
        }
    });
    fadeDurationSlider.setValue(player.getFadeDuration());

    final SelectBox<String> fadeInterpolationSelectBox = new SelectBox<String>(skin);
    final ObjectMap<String, Interpolation> interpolations = new ObjectMap<String, Interpolation>();
    interpolations.put("Linear", Interpolation.linear);
    interpolations.put("Fade", Interpolation.fade);
    interpolations.put("Circle", Interpolation.circle);
    interpolations.put("Sine", Interpolation.sine);
    interpolations.put("Bounce", Interpolation.bounce);
    interpolations.put("Elastic", Interpolation.elastic);
    interpolations.put("Swing", Interpolation.swing);
    fadeInterpolationSelectBox.setItems(interpolations.keys().toArray());
    fadeInterpolationSelectBox.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            player.setFadeInterpolation(interpolations.get(fadeInterpolationSelectBox.getSelected()));
        }
    });

    fadeTable.defaults().left().pad(1f);
    fadeTable.row();
    fadeTable.add("Duration");
    fadeTable.add(fadeDurationSlider).expandX().fill();
    fadeTable.add(fadeDurationLabel).width(40);
    fadeTable.row();
    fadeTable.add("Interpolation");
    fadeTable.add(fadeInterpolationSelectBox).colspan(2).expandX().fill();

    final CheckBox fadeCheckBox = new CheckBox("Fade", skin, "switch");
    fadeCheckBox.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            boolean fade = fadeCheckBox.isChecked();
            player.setFadingEnabled(fade);
            fadeTable.setVisible(fade);
        }
    });
    fadeCheckBox.setChecked(player.isFadingEnabled());
    fadeTable.setVisible(player.isFadingEnabled());

    controlTable.defaults().padTop(4f);
    controlTable.row().colspan(3);
    controlTable.add(shuffleCheckBox).left();
    controlTable.row().colspan(3);
    controlTable.add(repeatCheckBox).left();
    controlTable.row().colspan(3);
    controlTable.add(fadeCheckBox).left();
    controlTable.row().colspan(3);
    controlTable.add(fadeTable);
    controlTable.row();
    controlTable.add("Pan");
    controlTable.add(panSlider).colspan(2);
    controlTable.row().colspan(3);
    controlTable.add().expand();
    controlTable.row();
    controlTable.add(previousButton).right();
    controlTable.add(playPauseButton);
    controlTable.add(nextButton).left();
    controlTable.row();
    controlTable.add("Volume");
    controlTable.add(volumeSlider).colspan(2);
    controlTable.row();
    controlTable.add("Mute");
    controlTable.add(muteButton).colspan(2).left();

    /*********/
    /* Debug */
    /*********/

    Label debugLabel = new Label("", skin) {
        @Override
        public void act(float delta) {
            setText(player.toString());
            super.act(delta);
        }
    };

    /***************/
    /* Stage setup */
    /***************/

    Table leftTable = new Table(skin);
    leftTable.row();
    leftTable.add(scrollablePlaylistTable).expand().fillX().top();
    leftTable.row();
    leftTable.add(debugLabel).expandX().left().padLeft(30f).padTop(8f);

    Table rightTable = new Table(skin);
    rightTable.row();
    rightTable.add(controlTable).expandY().fill();
    rightTable.row();
    rightTable.add(fileFinder).padTop(10f);

    Table rootTable = new Table(skin);
    rootTable.setFillParent(true);
    rootTable.row();
    rootTable.add(leftTable).expand().fill();
    rootTable.add(rightTable).expandY().fill().padTop(25f).padLeft(8f);

    stage = new Stage(new ScreenViewport(camera), batch);
    stage.addActor(rootTable);

    /*********/
    /* Input */
    /*********/

    Gdx.input.setInputProcessor(stage);
}