Как вы подходите к разработке и реализации сложных анимаций взаимодействия с пользовательским интерфейсом?
(я не говорю о определенные языки и библиотеки, такие как jQuery или UIKit, если только они не заставляют вас думать о управлениивзаимозависимыми анимациями, которые меня интересуют.)
Рассмотрим обманчиво «простую» задачу, такую как проектирование и программирование домашнего экрана iOS.
Однако масштабы скрытой сложности поразительны.
Вот несколько вещей, которые я заметил в интерфейсе:
Я уверен, что здесь есть еще большая сложность, которую я не заметил.
В грубом обобщении для каждой пары (анимация, user_action)
в одном и том же контексте интерфейса необходимо решить что, если user_action
происходит, когда анимация
ужезапущена.
В большинстве случаев можно
Но тогда во время анимации может быть несколько действий, и вы должны решить, какие действия отбросить, какие поставить в очередь и выполнять ли все действия в очереди или только последнее, когда анимация закончится.
Если что-то ставится в очередь после завершения анимации и анимация изменяется, вам нужно решить, имеют ли смысл действия в очереди или их нужно удалить.
Если это звучит слишком теоретически, рассмотрим пример из реальной жизни: как вы поступаете, когда пользователь перетаскивает приложение вниз, ждет начала перестановки, а затем сразу же перетаскивает приложение обратно вверх и отпускает его. ? Как вы гарантируете, что анимация будет гладкой и правдоподобной во всех возможных случаях?
Я обнаружил, что не могу удержать в голове даже половину возможных сценариев.По мере увеличения выразительности пользовательского интерфейса число возможных состояний начинает сильно нарушать правило 7 ± 2.
Таким образом, мой вопрос заключается в следующем:
Как вы укрощаете сложность проектирования и реализации анимации?
Я заинтересован как в поиске эффективных способов осмысления проблемы, так и в способах ее решения.
Например, события и наблюдатели оказались очень эффективной абстракцией для большинства UI.
Но можете ли вы спроектировать и реализовать экран перетаскивания в стиле iOS, опирающийся на события как на основную абстракцию?
Насколько запутанным должен быть код, чтобы точно отображать все возможные состояния пользовательского интерфейса? Будет ли это обработчик событий, добавляющий другой обработчик событий, когда некоторая логическая переменная имеет значение true для функции, которая устанавливает ее в false, если только перед ней не был запущен еще один обработчик событий?
«Вы никогда не слышали о классах?» Вы можете задаться вопросом. У меня есть, но слишком много состояния, которым эти классы захотят поделиться.
Подводя итог, я ищу не зависящие от языка(хотя, вероятно, вдохновленные языком или фреймворком) методы управления сложными взаимозависимыми, отменяемыми анимациями, происходящими последовательно или сразу, и описание того, как они реагируют на действия пользователя.
(Все это с учетом того, что мне не нужнопрограммировать анимацию, т. е. у меня есть доступ к такой среде, как jQuery или Core Animation, которая может анимировать (стили, обратный вызов)
вещь для меня, и я могу отменить
ее.)
Структуры данных, шаблоны проектирования, DSL — все это хорошо, если помогает решить проблему.