1 显示界面填充
用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述,表中的每个元素代表一 个显示元素,可以是背景、小图标、字符等,UI_WidgetTypeDef 结构体含义如下:
typedef struct _UI_WidgetTypeDef
{
int16_t x; //起始显示位置横坐标
int16_t y; //起始显示位置纵坐标
int16_t active_ys; //有效滑动区域纵向起始位置
int16_t active_ye; //有效滑动区域纵向结束位置
int16_t width; //图片宽度
int16_t hight; //图片高度
uint32_t addr; //图片在flash中地址
uint16_t widget_id_type; //图标类型(背景、普通图标、遮挡图标、表盘指针、字符等)
union
{
UI_ClockPointerTypeDef clock_pointer;
UI_StringRecordTypeDef string_mem;
uint32_t mask_addr;
uint32_t graph_color;
uint32_t num_string_addr;
} u;
bool touch_capability; //是否支持点触菜单切换
void (*widget_touch_func)(uint32_t button_touch_type); //点触菜单切换回调函数
} UI_WidgetTypeDef;
typedef struct _UI_StringRecordTypeDef
{
uint16_t single_font_height; //字体高度
uint16_t font_number; //将要显示字符串中第几个字符
uint16_t font_count; //字符个数
uint32_t font_color; //字符颜色
} UI_StringRecordTypeDef;
2 回调函数实现功能
/* change Here for UI */
const UI_MenuTypeDef Player =
{
/* change Here for UI */
.name = (const char *)"Player",
.MenuParent = NULL,
.MenuSub = NULL,
.button_func = menu_button_cb,
.touch_func = menu_touch_cb,
.update_func = menu_update_cb,
.dynamic_cb = menu_dynamic_time_cb,
.display_cb = menu_display_time_cb,
.cur_display_info = menu_display_info_cb,
.constructor_cb = menu_constructor_cb,
.destructor_cb = menu_destructor_cb,
.pWidgetList = (UI_WidgetTypeDef *)icon,
.current_max_widget = sizeof(icon) / sizeof(UI_WidgetTypeDef),
};
menu_touch_cb 触摸屏回调函数,包括基本的触摸滑动类型。
触摸滑动类型 | 含义解释 |
TOUCH_HOLD | 横向跟指拖动 |
TOUCH_HOLD_Y | 纵向跟指拖动 |
TOUCH_ORIGIN_FROM_X | 横向回弹 |
TOUCH_ORIGIN_FROM_Y | 纵向回弹 |
TOUCH_RIGHT_SLIDE | 向右快速滑动 |
TOUCH_LEFT_SLIDE | 向左快速滑动 |
TOUCH_UP_SLIDE | 向上快速滑动 |
TOUCH_DOWN_SLIDE | 向下快速滑动 |
TOUCH_INVALIDE | 无效滑动 |
在此回调函数中可以实现菜单之间相互切换的逻辑关系。利用rtl_gui_menu_update()和rtl_gui_menu_slide()接口表明菜单之间的切换关系,接口详细说明参考下一节。
menu_constructor_cb构建当前菜单:
menu_ destructor _cb销毁当前菜单:
menu_display_info_cb更新菜单图标内容数组,例如时间菜单每次刷屏时所显示的时间不同,这时此回调回来更新所要显示的时间。
menu_dynamic_time_cb界面定时刷新回调。
menu_update_cb界面刷新回调。
3 关键接口
实际刷屏接口:
void rtl_gui_menu_update(UI_MenuTypeDef *ui_cur, void *p_ui_cur_argv, \
UI_MenuTypeDef *ui_sub, void *p_ui_sub_argv, \
UI_MenuTypeDef *ui_par, void *p_ui_par_argv, \
int16_t detal_x, int16_t detal_y)
- ui_cur,当前菜单,p_ui_cur_argv,对应菜单内容更新;
- ui_sub,下滑/右滑菜单,p_ui_sub_argv,对应菜单内容更新;
- ui_par,上滑/左滑菜单,p_ui_par_argv,对应菜单内容更新;
- detal_x,滑动造成的横向偏移;
- detal_y,滑动造成的纵向偏移;
记录各个菜单详情以及滑动位置及距离:
void rtl_gui_menu_slide(UI_MenuTypeDef *ui_cur, void *p_ui_cur_argv, \
UI_MenuTypeDef *ui_sub, void *p_ui_sub_argv, \
UI_MenuTypeDef *ui_par, void *p_ui_par_argv, \
int16_t from_x, int16_t to_x, \
int16_t from_y, int16_t to_y)
- ui_cur,当前菜单,p_ui_cur_argv,对应菜单内容更新;
- ui_sub,下滑/右滑菜单,p_ui_sub_argv,对应菜单内容更新;
- ui_par,上滑/左滑菜单,p_ui_par_argv,对应菜单内容更新;
- from_x,横向起始滑动位置;
- to_x,横向目标位置;
- from_y,纵向起始滑动位置;
- to_y,纵向目标位置;