Анимирование
Все мы видели, как игровые интерфейсы умеют не просто открываться, а делать это с некоторыми эффектами. Например инвентарь движется снизу вверх при открытии, а при закрытии сверху вниз. Появление достижений из Java издания игры и изучений из Ancient Wonders и Infinite Forest тоже имеет свою анимацию. В данной главе мы рассмотрим, какие есть подходы реализации похожего поведения, а так же некоторые особенности, которые вам придётся учитывать.
Использование потоков
В одной из прошлых статей мы разбирали потоки, если вы её не видели, обязательно прочитайте. Есть несколько подходов для создания анимации, такие как использование Updatable, android.animation.ValueAnimator и Threading. Мы будем рассматривать только Threading, ведь это позволит нам более удобно разобрать создание анимаций.
Отрисовка
Тут мы рассмотрим, как мы будем взаимодействовать с элементами нашего окна в потоке.
Старый способ изменять данные элементов
Старый способ изменения параметров элементов работает хорошо, но только не в анимациях. Он работает недостаточно быстро, что скажется на плавности.
<UI.Window>.content.elements[название элемента][название ключа] = значение;
Давайте рассмотрим другой, более быстрый способ.
Новый способ изменять данные элементов
На замену прошлого способа к нам приходят отдельные функции, которые позволяют изменять элементы без перерисовки окна.
Ключевые методы для работы:
const elements = <UI.Window>.getElements();
const element = elements.get(название ключа); //получаем наш элемент в нужном представлении, который мы регистрировали в <UI.Window>.content.elements
//методы для получения данных вне зависимости от того, открыто ли окно:
element.setBinding(название ключа, значение) //это позволяет менять другие параметры помимо позиции по имени ключа, никогда не меняйте позицию при помощи него
element.getBinding(название ключа) //возвращает значение по названию ключа
element.setPosition(x, y) //позволяет очень быстро менять позиции элементов, это нам сегодня и понадобится
//методы, работающие строго при открытом окне:
const alpha = <UI.Window>.layout.getAlpha(); //получаем прозрачность окна
<UI.Window>.layout.setAlpha(число от 0 до 1); //ставим прозрачность окну
<UI.IElement>.setBinding(key, value)
Если какой-то ключ не получается изменить новым способом, используйте старый.