package application; import javafx.animation.TranslateTransition; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.util.Duration; /** * Created by tareq on 7/13/15. */ public class DrawerLayout extends Pane { private double oldX; private double startX; private boolean animationFinished = false; ActionBar actionBar; public void setDrawerOpen(boolean drawerOpen) { this.drawerOpen = drawerOpen; } public boolean isDrawerOpen() { return drawerOpen; } private boolean drawerOpen = false; public DrawerLayout() { super(); sceneProperty().addListener((observable, oldValue, newValue) -> { if (newValue != null) { if (!getScene().getStylesheets().contains(getClass().getResource("application.css").toExternalForm())) getScene().getStylesheets().add(getClass().getResource("application.css").toExternalForm()); newValue.widthProperty().addListener((ob, o, n) -> { if (getPrefWidth() == -1) { setPrefWidth(n.doubleValue() * 0.4); setLayoutX(-getPrefWidth()); } }); newValue.heightProperty().addListener((ob, o, n) -> { setPrefHeight(n.doubleValue() - 50); }); setLayoutY(50); } }); translateXProperty().addListener((observable, oldValue, newValue) -> { actionBar.setAnimationProgress(-newValue.doubleValue() / getWidth()); }); getStyleClass().add("material-drawer"); addEventHandler(MouseEvent.MOUSE_DRAGGED, e -> { if (oldX == 0) startX = e.getX(); if (oldX != 0 && (e.getX() - oldX) < 0) { if (e.getSceneX() < getWidth() / 2) { animationFinished = true; } setTranslateX(getTranslateX() - 4); } oldX = e.getX(); }); addEventHandler(MouseEvent.MOUSE_RELEASED, e -> { e.consume(); if (startX != 0) { startOpenAnimation(animationFinished); } }); } public void startOpenAnimation(boolean finished) { TranslateTransition transition = new TranslateTransition(); transition.setNode(this); transition.setDuration(Duration.millis(500)); if (finished) { transition.setToX(0); transition.setOnFinished(ev -> { drawerOpen = false; actionBar.setDrawerOpen(false); oldX = 0; startX = 0; }); } else { transition.setToX(getPrefWidth()); transition.setOnFinished(ev -> { drawerOpen = true; actionBar.setDrawerOpen(true); oldX = 0; startX = 0; }); } transition.play(); animationFinished = false; } }