您如何设计和实现复杂的 UI 交互动画?
(我不是在谈论特定的语言和库,如 jQuery 或 UIKit,除非它们迫使你以特定的方式思考管理相互依赖的动画,我对此很感兴趣。)
考虑一个看似“简单”的任务,例如设计和编程 iOS 主屏幕。
然而,隐藏的复杂性是惊人的。
关于界面,我注意到了一些事情:
- 当您几乎不触摸图标时,它的不透明度会发生变化,但大小变化会延迟。
- 如果您在其他两个应用程序之间拖动一个应用程序,则在所有应用程序重新排列以移动可用空间之前会有明显的延迟。因此,如果您只是继续在屏幕上移动应用程序,那么在您安顿下来之前什么都不会发生。
- 重新排列是逐行发生的,首先是你悬停在的那一行,它会触发链中的下一行,到之前空闲空间所在的那一行。
- 如果您删除了一个应用程序,它将在现在可用的空间中删除,而不仅仅是您删除它的位置。
- 如果您将一个应用程序悬停在另一个应用程序上,则会出现径向灯,闪烁两次,然后才会创建一个组。
- 如果组在空闲空间的右侧创建,然后被丢弃,它将在丢弃时向左动画以占用空闲空间。
我敢肯定这里还有更多我没有注意到的复杂性。
连续动画与离散动作
粗略概括,对于同一接口上下文中的每一对,(animation, user_action)
您需要确定如果user_action
在animation
已经运行时发生了什么。
在大多数情况下,您可以
- 取消动画;
- 随时随地更改动画;
- 忽略动作;
- 将动作排队到动画完成时。
但是在动画过程中可能会有几个动作,你必须决定要丢弃哪些动作,要排队,以及是在动画结束时执行所有排队的动作,还是只执行最后一个动作。
如果动画结束时有东西排队,并且动画发生了变化,你需要决定排队的动作是否仍然有意义,或者需要被删除。
如果这听起来太理论化,请考虑一个真实世界的示例:您如何处理用户向下拖动应用程序,等待重新排列开始,然后立即将应用程序向上拖动并释放它?您如何确保动画在所有可能的情况下都流畅且可信?
适合工作的工具
我发现自己甚至无法将一半的可能场景记在脑海中。随着 UI 表现力的增加,可能的状态数量开始严重违反 7±2 规则。
因此,我的问题如下:
你如何驯服动画设计和实现的复杂性?
我对找到思考问题的有效方法以及解决问题的方法都很感兴趣。
例如,事件和观察者被证明是大多数 UI 的非常有效的抽象。
但是你能设计和实现一个依赖事件作为主要抽象的类似 iOS 的拖放屏幕吗?
代码必须有多复杂才能准确表示 UI 的所有可能状态?当某个布尔变量为真到将其设置为假的函数时,它是否会是一个事件处理程序添加另一个事件处理程序,除非另一个事件处理程序在它之前运行?
“你没听说过上课吗?” 你可能想知道。为什么,我有,但是这些课程想要分享的状态太多了。
总而言之,我正在寻找与语言无关(尽管可能受语言或框架启发)的技术,用于管理按顺序或同时发生的复杂的相互依赖、可取消的动画,并描述它们对用户操作的反应。
(考虑到我不必自己编写动画——也就是说,我确实可以访问像 jQuery 或 Core Animation 这样的框架,这些框架可以满足animate(styles, callback)
我的需求,而且我可以cancel
做到。)
如果数据结构、设计模式、DSL 有助于解决问题,它们都是好的。