Как вы подходите к разработке и реализации сложных анимаций взаимодействия с пользовательским интерфейсом?
(Я не говорю о конкретных языках и библиотеках, таких как jQuery или UIKit, если только они не заставляют вас думать о управлении взаимозависимыми анимациями, что меня интересует.)
Рассмотрим обманчиво «простую» задачу, такую как проектирование и программирование домашнего экрана iOS.

Однако масштабы скрытой сложности поразительны.
Вот несколько вещей, которые я заметил в интерфейсе:
- Когда вы едва касаетесь значка, его непрозрачность меняется, но изменение размера задерживается.
- Если вы перетаскиваете приложение между двумя другими приложениями, происходит заметная задержка, прежде чем все приложения перегруппируются, чтобы переместить свободное пространство. Поэтому, если вы просто продолжаете перемещать приложение по экрану, ничего не произойдет, пока вы не остановитесь.
- Перестановка происходит построчно, сначала идет строка, на которую вы наведены, и запускается следующая строка в цепочке, к строке, где ранее было свободное пространство.
- Если вы уроните приложение, оно упадет на освободившееся место, а не только там, где вы его уронили.
- Если вы наведете курсор на приложение над другим приложением, появится радиальный свет, мигнет дважды, и только тогда будет создана группа.
- Если группа была создана справа от свободного места, а затем отброшена, она будет анимирована слева, чтобы занять свободное место при удалении.
Я уверен, что здесь есть еще большая сложность, которую я не заметил.
Непрерывная анимация против дискретных действий
Грубо говоря, для каждой пары (animation, user_action) в одном контексте интерфейса вам нужно решить, что, если user_action произойдет, пока animation уже запущен.
В большинстве случаев вы можете
- Отмените анимацию;
- Меняйте анимацию на ходу;
- Игнорируйте действие;
- Поставьте действие в очередь до завершения анимации.
Но тогда во время анимации может быть несколько действий, и вы должны решить, какие действия отбросить, какие поставить в очередь, и выполнять ли все действия в очереди или только последнее, когда анимация закончится.
Если что-то ставится в очередь после завершения анимации и анимация изменяется, вам необходимо решить, имеют ли все еще смысл действия в очереди или их нужно удалить.
Если это звучит слишком теоретически, рассмотрим реальный пример: как поступить, когда пользователь перетаскивает приложение вниз, ожидает начала перестановки, а затем сразу же перетаскивает приложение вверх и отпускает его? Как сделать так, чтобы анимация была плавной и правдоподобной во всех возможных случаях?
Правильные инструменты для работы
Я не могу держать в голове даже половину возможных сценариев. По мере увеличения выразительности пользовательского интерфейса количество возможных состояний начинает резко нарушать правило 7 ± 2.
Поэтому мой вопрос таков:
Как справиться со сложностями в разработке и реализации анимации?
Я заинтересован как в поиске эффективных способов осмысления проблемы, так и в способах ее решения.
Например, события и наблюдатели оказались очень эффективной абстракцией для большинства пользовательских интерфейсов.
Но можете ли вы спроектировать и реализовать экран перетаскивания в стиле iOS, полагаясь на события в качестве основного абстракция?
Насколько запутанным должен быть код, чтобы точно отображать все возможные состояния пользовательского интерфейса? Будет ли это обработчик событий, добавляющий еще один обработчик событий, когда некоторая логическая переменная истинна для функции, которая устанавливает для нее значение false, если до нее не запускался еще один обработчик событий?
«Вы никогда не слышали о классах?» вы можете задаться вопросом. Да, да, но есть слишком много состояний, которыми эти классы захотят поделиться.
Подводя итог, я ищу не зависящие от языка (хотя, вероятно, основанные на языке или фреймворке) методы управления сложными взаимозависимыми, отменяемыми анимациями, происходящими последовательно или сразу и описывая, как они реагируют на действия пользователя.
(Все это с учетом того, что мне не нужно программировать анимацию самостоятельно, т. Е. У меня есть доступ к фреймворку, подобному jQuery или Core Animation, который может animate(styles, callback) для меня, и я могу cancel это. )
Структуры данных, шаблоны проектирования, DSL - все это хорошо, если они помогают решить проблему.

