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