窗口动画是现代 GUI 最基本的功能之一,在窗口打开或关闭时,引入一个过渡动画,让用户感觉这个过程是流畅的。窗口动画的基本原理很简单:在打开或关闭窗口时,把前后两个窗口预先绘制到两张内存图片上,按照指定规则显示两张图片,形成动画效果。
窗口本身只需指定期望的动画类型,由窗口管理器负责在适当的时候(如打开和关闭窗口时),创建窗口动画并让窗口动画绘制到屏幕上。在窗口动画期间,窗口管理器会禁止窗口本身的绘制,并忽略所有输入事件。目前支持的动画有:
普通窗口动画:
对话框动画:
以前的 bottom_to_top 相当于 popup,仍然可以使用,但建议用 popup 代替。
以前的 top_to_bottom 相当于 popdown,仍然可以使用,但建议用 popdown 代替。
对话框的动画可与 对话框的 highlight 属性 一起使用。
窗口动画有三种实现方式:
在系统支持 OpenGL 时,使用 vgcanvas 进行绘制,因为使用了浮点数,整个动画最为平滑。
在系统支持 FrameBuffer,使用 lcd 绘图函数实现动画。
在低端系统上,不启用动画。
给窗口或对话框指定动画效果,只需设置窗口或对话框的 anim_hint 属性即可:
<window name="main" anim_hint="vtranslate">
...
</window>
anim_hint 的可选值,请参考 window_animator.h 中的定义。
可以为动画指定参数,其格式为 类似函数调用的参数格式。
如:
anim_hint="center_scale(duration=300)"
2.slide_up、slide_down、slide_left 和 slide_right 动画特有参数:
alpha 值用于在背景上画一层透明的颜色,这能够实现让背景变暗的效果。如果 start_alpha 和 end_alpha 不相同,则能实现动态变暗的效果,这有额外的运行开销,如果性能不佳,建议设置 alpha 即可。
demoui 演示了各种窗口动画:
./bin/demoui
开发者可以自定义动画,自定义的动画可以像内置动画一样,在 XML 文件中启用。
自定义动画非常简单,通常只需要几行代码即可。步骤如下:
static const window_animator_vtable_t s_window_animator_popup_vt = {
.overlap = TRUE,
.type = "popup",
.desc = "popup",
.size = sizeof(window_animator_t),
.draw_prev_window = window_animator_overlap_default_draw_prev,
.draw_curr_window = window_animator_to_top_draw_curr};
window_animator_t* window_animator_popup_create(bool_t open, object_t* args) {
return window_animator_create(open, &s_window_animator_popup_vt);
}
window_animator_factory_register(factory, WINDOW_ANIMATOR_POPUP,
window_animator_popup_create);
完整示例请参考:https://github.com/zlgopen/awtk/tree/master/src/window_animators
启用窗口动画时,默认情况下,需要对前后两个窗口进行截图,以获得更好的性能,但是需要两个 FB 大小的内存。如果内存不够(比如只有片内内存),可以选择关闭缓存,直接进行绘制。在 awtk_config.h 定义下面的宏即可:
#define WITHOUT_WINDOW_ANIMATOR_CACHE 1
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。