Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
JavaFX.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
4.88 Mб
Скачать

3.3.4 Створення анімації кнопок

Незмінні малюнки в ролі кнопок — це не є добрим рішенням для інтерфейсу користувачів, тому потрібно зробити їх більш інтерактивними за допомогою ефектів та анімації. Всі ці дії потрібно зробити в методі, який створює кнопки інтерфейсу — createButton з класу ButtonCreator:

public abstract class ButtonCreator {

private static final double SCALE = 1.2; // коеффіцієнт збільшення

private static final double DURATION = 300; // час анімації в мс

public static Node createButton(String iconPath, final Runnable action) {

final ImageView node = new ImageView(new Image(iconPath));

node.setFitWidth(100);

node.setPreserveRatio(true);

final ScaleTransition animationGrow = new ScaleTransition(Duration.millis(DURATION), node);

animationGrow.setToX(SCALE);

animationGrow.setToY(SCALE);

final ScaleTransition animationShrink = new ScaleTransition(Duration.millis(DURATION), node);

animationShrink.setToX(1);

animationShrink.setToY(1);

final Reflection effect = new Reflection();

node.setEffect(effect);

node.setOnMouseEntered(new EventHandler<MouseEvent>() {

public void handle(MouseEvent event) {

node.toFront();

animationShrink.stop();

animationGrow.playFromStart();

}

});

node.setOnMouseExited(new EventHandler<MouseEvent>() {

public void handle(MouseEvent event) {

animationGrow.stop();

animationShrink.playFromStart();

}

});

final ColorAdjust effectPressed = new ColorAdjust(0, 0, -0.5, 0);

node.setOnMouseClicked(new EventHandler<MouseEvent>() {

public void handle(MouseEvent event) {

action.run();

effect.setInput(effectPressed);

Timeline tl = new Timeline(new KeyFrame(Duration.millis(300), new EventHandler<ActionEvent>() {

public void handle(ActionEvent event) {

effect.setInput(null);

}

}));

tl.play();

}

});

return node;

}

}

Отже тепер метод виконує такі дії:

  1. Завантажує зображення кнопки;

  2. Створює анімацію зростання зображення;

  3. Створює анімацію зменшення зображення;

  4. Додається ефект віддзеркалення;

  5. Пов’язуються події вказівника миші зі збільшенням та зменшенням зображення;

  6. При натисканні на зображення воно затемнюється на 300 мілісекунд.

Потрібно відмітити, що додавання ефектів до елементу, який вже має ефект (в даному випадку — віддзеркалення), потрібно робити через метод setInput.

Через те, що тепер елементи зростають при наведенні, потрібно збільшити ширину акордеону. Ширина зображень 100 пікселей, коефіцієнт зростання 1.2, тобто потрібно в методі getAccordion() взяти трохи більше, ніж 120:

accordion.setPrefWidth(130);

Запустивши додаток, можна подивитись на результат (рис. 3.28).

Рис. 3.28. Збільшена кнопка з віддзеркаленням

Практичне завдання

  1. Додати до панелі інструментів і до акордеону кнопку зміни користувача (переходу до вікна авторизації).

  2. Додати до LineChart третій графік.

  3. Додати в кожній країні до BarChart власні популяційні прогнози на 2020 рік.

  4. При наведенні на кнопку меню створити анімацію обертання навколо осі. Перед початком обертання прибрати ефект віддзеркалення, по закінченню обертання додати віддзеркалення.

Контрольні питання

  1. Які класи реалізують веб-браузер?

  2. Скільки типів графіків існує в JavaFX? Назвіть класи, які їх презентують.

  3. З яких елементів створюється Accordion?

  4. Які види створення анімації ви знаєте?

  5. Які існують типи переходів (Transition)?