高通字库
版本 V2.0 · 更新于 2026-05-25

8. 控件事件

  事件是对各种控件由于应用程序内部或者外部产生的事情或动作处理的通称,在高通 GT-HMI 中常见的事件为加载屏幕,背景、字体颜色变化,位置、大小变化等。事件通常使用 gt_obj_add_event_cb 函数为控件添加事件回调函数,在回调函数中实现对应的事件处理逻辑。

8.1 加载屏幕

  加载屏幕事件为屏幕控件特有事件,主要用于屏幕页面间跳转使用。所有页面都由页栈进行管理。

  首先,通过枚举变量给每个页面注册页面 ID:

typedef enum {
    GT_ID_SCREEN_HOME = 0,
    GT_ID_SCREEN_1 = 1,
    GT_ID_SCREEN_2 = 2,
    GT_ID_SCREEN_3 = 3,
    GT_ID_SCREEN_4 = 4,
} gt_scr_id_et;

  其次,创建页面对象:

gt_obj_st * screen_1 = NULL;
gt_obj_st * gt_init_screen_1(void)
{
    screen_1 = gt_obj_create(NULL);
    gt_screen_set_bgcolor(screen_1, gt_color_hex(0xFFFFFF));
    // 添加控件到页面 screen_1
    return screen_1;
}

  然后,将页面 ID 与对应的页面绑定:

static const gt_scr_list_st gt_scr_list[] = {
    {GT_ID_SCREEN_HOME, gt_init_screen_home},
    {GT_ID_SCREEN_1, gt_init_screen_1},
    {GT_ID_SCREEN_2, gt_init_screen_2},
    {GT_ID_SCREEN_3, gt_init_screen_3},
    {GT_ID_SCREEN_4, gt_init_screen_4},
};

  最后,初始化页栈并设置主页:

void gt_ui_init(void) {
    gt_scr_stack_register_id_list(gt_scr_list,
        sizeof(gt_scr_list) / sizeof(gt_scr_list[0]));
    gt_scr_stack_set_home_scr_id(GT_ID_SCREEN_HOME, false);
    gt_disp_stack_load_scr(GT_ID_SCREEN_HOME);
}

  以下示例为在 screen_home 中的 btn1 按钮添加加载屏幕事件,实现点击按下 btn1 控件时跳转到 screen_1 界面:

static void btn1_0_cb(gt_event_st * e) {
    gt_disp_stack_load_scr_anim(GT_ID_SCREEN_1,
        GT_SCR_ANIM_TYPE_NONE, 500, 0, true);
}
gt_obj_add_event_cb(btn1, btn1_0_cb, GT_EVENT_TYPE_INPUT_PRESSED
    , NULL);

  加载屏幕时可以为其添加过渡动画,以下为 screen_1 屏幕控件添加延时 0ms 执行、类型为向左移动、持续时间为 500ms 的过渡动画:

gt_disp_stack_load_scr_anim(GT_ID_SCREEN_1,
    GT_SCR_ANIM_TYPE_MOVE_LEFT, 500, 0, true);

  返回页面时可选择返回层数,以下示例为返回上一页:

gt_disp_stack_go_back(1);

8.2 移动动画

  移动动画事件主要用于实现平滑移动控件,以下为 btn1 按钮添加移动动画事件,当滑动 btn1 控件时将触发 btn2 按钮控件平滑地移动到(10, 10):

static void btn1_0_cb(gt_event_st * e)
{
    static gt_anim_param_st param;
    gt_anim_param_init(&param);
    gt_anim_param_set_time(&param, 0, 100);
    gt_anim_param_set_dst_point(&param, 10, 10);
    gt_anim_param_set_path_type(&param, GT_ANIM_PATH_TYPE_OVERSHOOT);
    gt_anim_pos_move(btn2, &param);
}
gt_obj_add_event_cb(btn1, btn1_0_cb, GT_EVENT_TYPE_INPUT_SCROLL, NULL);

8.3 背景颜色变化

  背景颜色变化主要用于实现改变控件本身的背景颜色。事件添加代码与上述重复,仅展示回调函数差异如下所示:

static void btn1_0_cb(gt_event_st * e)
{
    gt_btn_set_color_background(btn2, gt_color_hex(0xff0000));
}

8.4 手势返回

  手势返回主要用于实现页面切换,以下为 screen_home 屏幕添加手势返回事件,当在 screen_home 屏幕控件中右滑时将返回上一页:

static void screen_home_0_cb(gt_event_st * e) {
    gt_disp_stack_go_back(1);
}
gt_obj_add_event_cb(screen_home, screen_home_0_cb,
    GT_EVENT_TYPE_INPUT_HOME_GESTURE_RIGHT, NULL);

8.5 其他事件

  其他诸如字体颜色变化、位置变化、大小变化、透明度变化、文本变化、隐藏等事件与背景颜色变化事件类似,皆为在回调函数中调用控件函数接口实现,本文档不再一一列举。


8.6 事件 API 参考

添加/移除事件

函数说明
void gt_obj_add_event_cb(gt_obj_st * obj, gt_event_cb_t event, gt_event_type_et filter, void * user_data)为对象添加事件回调。user_data 默认传 NULL
void gt_obj_add_replace_core_event_cb(gt_obj_st * obj, gt_event_cb_t event, gt_event_type_et filter, void * user_data)[高级] 用自定义回调替换内核默认事件处理
bool gt_event_has_event_cb(gt_obj_st * obj, gt_event_type_et filter)检查是否已注册指定类型事件回调
bool gt_event_has_the_same_cb(gt_obj_st * obj, gt_event_cb_t event, gt_event_type_et filter)检查是否已注册完全相同的事件回调
uint16_t gt_obj_get_user_event_count(gt_obj_st * obj)获取对象已注册的事件回调数量
void gt_obj_remove_all_event_cb(gt_obj_st * obj)[安全] 移除对象所有事件回调
void gt_obj_remove_all_event_cb_immediately(gt_obj_st * obj)[不安全] 立即移除所有事件回调

发送事件

函数说明
gt_res_t gt_event_send(gt_obj_st * parent, gt_event_type_et event, void * parms)向对象发送事件
gt_res_t gt_event_send_delay(gt_obj_st * parent, gt_event_type_et event, void * parms, int32_t delay_ms)延时发送事件
gt_res_t gt_event_send_to_childs(gt_obj_st * parent, gt_event_type_et event, void * parms)向对象的所有子对象发送事件
gt_res_t gt_event_send_by_id(gt_id_t widget_id, gt_event_type_et event, void * parms)按控件 ID 发送事件

全局事件

条件编译宏:GT_USE_LAYER_TOP

函数说明
void gt_global_add_event_cb(gt_event_cb_t event, gt_event_type_et filter, void * user_data)注册全局事件回调
void gt_global_remove_all_event_cb(void)[安全] 移除所有全局事件回调

获取事件信息

函数说明
gt_event_type_et gt_event_get_code(gt_event_st * e)获取事件的类型码

8.7 事件类型速查表

完整事件类型枚举定义于 gt_event.h

输入设备事件

事件常量说明适用场景
GT_EVENT_TYPE_INPUT_RELEASED释放按钮松开
GT_EVENT_TYPE_INPUT_PRESSING持续按下(未滚动时)按住不放
GT_EVENT_TYPE_INPUT_PRESSED按下(点击)按钮点击
GT_EVENT_TYPE_INPUT_LONG_PRESSED长按长按操作
GT_EVENT_TYPE_INPUT_PRESS_LOST按下后移出控件丢失焦点误触取消
GT_EVENT_TYPE_INPUT_SCROLL_START开始滚动滚动检测
GT_EVENT_TYPE_INPUT_SCROLL滚动中滑动时连续触发
GT_EVENT_TYPE_INPUT_SCROLL_END滚动结束滚动停止
GT_EVENT_TYPE_INPUT_KEY键盘按键按下键盘控件
GT_EVENT_TYPE_INPUT_KEY_PRESSING键盘按键持续按下键盘长按
GT_EVENT_TYPE_INPUT_KEY_RELEASED键盘按键松开键盘释放
GT_EVENT_TYPE_INPUT_KEY_LONG_PRESSED键盘按键长按键盘长按
GT_EVENT_TYPE_INPUT_FOCUSED获得焦点焦点切换
GT_EVENT_TYPE_INPUT_SCROLL_UP向上滚动方向检测
GT_EVENT_TYPE_INPUT_SCROLL_DOWN向下滚动方向检测
GT_EVENT_TYPE_INPUT_SCROLL_LEFT向左滚动方向检测
GT_EVENT_TYPE_INPUT_SCROLL_RIGHT向右滚动方向检测
GT_EVENT_TYPE_INPUT_HIDED浮层控件需隐藏系统内部
GT_EVENT_TYPE_INPUT_HOME_GESTURE_TOP顶部手势手势返回
GT_EVENT_TYPE_INPUT_HOME_GESTURE_BOTTOM底部手势手势返回
GT_EVENT_TYPE_INPUT_HOME_GESTURE_LEFT左侧手势手势返回
GT_EVENT_TYPE_INPUT_HOME_GESTURE_RIGHT右侧手势手势返回
GT_EVENT_TYPE_INPUT_PLAY_START开始播放媒体/动画
GT_EVENT_TYPE_INPUT_PLAY_END播放结束媒体/动画

值更新事件

事件常量说明适用场景
GT_EVENT_TYPE_UPDATE_VALUE值更新(需重绘)滑动条、计数器等
GT_EVENT_TYPE_UPDATE_STYLE样式更新主题切换

绘制事件

事件常量说明
GT_EVENT_TYPE_DRAW_START开始绘制
GT_EVENT_TYPE_DRAW_END绘制结束
GT_EVENT_TYPE_DRAW_REDRAW重绘请求
GT_EVENT_TYPE_SCREEN_LOAD_BEFORE[内核调用] 屏幕加载前
GT_EVENT_TYPE_SCREEN_HIDE[内核调用] 当前屏幕被新屏幕覆盖
GT_EVENT_TYPE_SCREEN_BEFORE_GO_BACK[内核调用] 屏幕返回前

控件变化事件

事件常量说明
GT_EVENT_TYPE_CHANGE_CHILD_REMOVE[内核调用] 移除子控件前
GT_EVENT_TYPE_CHANGE_CHILD_REMOVED[内核调用] 移除子控件完成
GT_EVENT_TYPE_CHANGE_CHILD_ADD[内核调用] 添加子控件
GT_EVENT_TYPE_CHANGE_CHILD_DELETE[内核调用] 删除子控件前
GT_EVENT_TYPE_CHANGE_CHILD_DELETED[内核调用] 删除子控件完成
GT_EVENT_TYPE_CHANGE_DELETED[内核调用] 自身删除完成

边界与手势事件

事件常量说明启用条件
GT_EVENT_TYPE_PULL_TO_REFRESH[内核调用] 滚动到顶部,下拉刷新自动触发
GT_EVENT_TYPE_LOAD_MORE[内核调用] 滚动到底部,加载更多自动触发
GT_EVENT_TYPE_SWIPE_UP上滑手势gt_obj_set_swipe_dir(obj, true)
GT_EVENT_TYPE_SWIPE_DOWN下滑手势gt_obj_set_swipe_dir(obj, true)
GT_EVENT_TYPE_SWIPE_LEFT左滑手势gt_obj_set_swipe_dir(obj, true)
GT_EVENT_TYPE_SWIPE_RIGHT右滑手势gt_obj_set_swipe_dir(obj, true)

通知事件

事件常量说明
GT_EVENT_TYPE_NOTIFY_CLOSE通知控件关闭

禁用屏幕动画时暂停事件:如果 GT_USE_SCREEN_ANIM 启用,可通过 gt_event_set_enabled(bool) 在屏幕动画期间禁用/启用事件处理。