# 6. 高级功能
# 6.1 MVVM 控制动画启停
MVVM 模式中,为了彻底分离用户界面与业务逻辑,通常不能在业务代码中调用 GUI 相关的 API 控制 UI 动画的启停。为此,AWTK 提供了一个特殊的解决方案,其原理是通过指定控件(widget_t)中的 "exec" 属性来执行特定的函数,"exec" 属性的值由函数名和参数两部分组成,两者用英文冒号分隔,目前主要用于动画的控制,支持的函数有:
函数名 | 说明 |
---|---|
start_animator | 开始动画 |
stop_animator | 停止动画 |
pause_animator | 暂停动画 |
destroy_animator | 销毁动画 |
比如下面的属性表示开始 rotation 动画,其中 rotation 为动画名称,如果不指定动画名称,则表示开始该控件上的所有动画:
exec="start_animator:rotation"
在 MVVM 项目中,一般是根据模型中数据来控制动画。比如模型中有一个 value 数据,当 value 大于 3 时,启动 label 控件上的所有动画,否则暂停控件上的所有动画,UI 文件代码如下:
<label x="0" y="0" w="160" h="28" text="Label" v-data:exec="{value > 3 ? 'start_animator' : 'pause_animator'}" animation="opacity(easing=linear,auto_start=false,from=0,to=255)"/>
在 AWTK Designer 中只需对控件的 "exec" 属性进行数据绑定即可,操作如下图所示:

上述采用了数据绑定的方式更新 "exec" 属性的值,当模型中的 value 变化时,会触发 ViewModel 更新,此时会执行 "exec" 中的代码。
此外,在 AWTK Designer 中,我们还可以通过调用 FScript 脚本中的 widget_set() 函数来主动设置控件的 "exec" 属性,步骤如下:
步骤一:创建一个 button 控件,并为 button 控件创建一个控件动画,动画名称为"move",如下图所示:

步骤二:为 button 控件添加一个点击事件,并在点击事件中执行 FScript 脚本,如下图所示:

步骤三:编写 FScript 脚本启动控件上的"move"动画,代码如下:
/* 设置当前(self)控件上的"exec"属性,属性值为"start_animator:move" */
widget_set('self', 'exec', 'start_animator:move')
widget_set() 接口的声明及其用法请参考 FScript 的相关文档。
步骤四:点击 button 控件,可以看见"move"动画开始播放。
上述示例只介绍了启动动画(start_animator),其他动画函数的用法也是类似的。