在开发了不少只能穿戴类的手表后,做上层的UI应用开发,系统的总结和规划了一下UI显示架构,足够使用普通的手表UI应用开发。下面来介绍一个UI架构的一个结构体,也是贯穿全程的重要节点!
//activity_page.h 文件里面的各种定义
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OS_MALLOC malloc
#define OS_FREE free
#define QPRINTF printf
typedef enum {
UNKNOW_EVENT = 0,
PRESS_EVENT,
UP_SLIDE_EVENT,
DOWN_SLIDE_EVENT,
LEFT_SLIDE_EVENT,
RIGHT_SLIDE_EVENT,
LONG_PRESS_EVENT,
DOWN_EDGE_SLIDE_EVENT,
} tp_event_type_t; //TP的各种事件
typedef struct {
tp_event_type_t type;
int x;
int y;
} tp_event_t;
typedef struct {
uint8_t main_item;
uint8_t second_item;
bool is_notif;
}main_page_t;//UI界面的item归类
typedef void (*key_event_func_t) (void *data);//按键函数原型
typedef void (*touch_event_func_t) (tp_event_t *tp_event);//触摸函数原型
typedef void (*create_frame_func_t) (void *data);//新建一个窗体执行函数原型
typedef bool(*handle_func_t) (void *data);//定时更新函数原型
typedef void (*free_data_func_t) (void *data);//资源释放函数原型
typedef struct {
touch_event_func_t touch_event_func;
key_event_func_t key_event_func;
}input_event_t;//input事件类型集合,以后可扩展
typedef struct {
main_page_t main_page;
input_event_t input_event;
create_frame_func_t create_frame_func;
void *create_data;
handle_func_t update_handle_func;
void *update_data;
handle_func_t animation_handle_func;
void *animation_data;
free_data_func_t free_data_func;
void *free_data;
} activity_page_t;
void activity_page_data_init(const activity_page_t * data);
//activity_page.c //实现原型
#include "activity_page.h"
static activity_page_t g_activity_page;//定义全局的UI 窗体的结构体
void activity_page_data_init(const activity_page_t * activity_page)//本函数在每次新建一个窗体时调用,释放上一个窗体的资源
{
void *ptr = NULL;
create_frame_func_t create_frame = NULL;;
QPRINTF("Old UI: (%d : %d) %d\n\r", g_activity_page.main_page.main_item,
g_activity_page.main_page.second_item, g_activity_page.main_page.is_notif);//打印调试信息
if (g_activity_page.update_data) {//释放刷新的资源
OS_FREE(g_activity_page.update_data);
}
if (g_activity_page.main_page.is_notif) {//窗体当消息通知时的处理
create_frame = g_activity_page.create_frame_func;
ptr = g_activity_page.create_data;
} else {
if (g_activity_page.create_data) {
OS_FREE(g_activity_page.create_data);
}
}
if (g_activity_page.free_data_func) {
g_activity_page.free_data_func(g_activity_page.free_data);
}
if (g_activity_page.free_data) {
OS_FREE(g_activity_page.free_data);
}
QPRINTF("free ok\n\r");
if (activity_page) {
memcpy(&g_activity_page, activity_page, sizeof(activity_page_t));
} else {
memset(&g_activity_page, 0x0, sizeof(activity_page_t));
}
if (g_activity_page.main_page.is_notif) {
g_activity_page.create_frame_func = create_frame;
g_activity_page.create_data = ptr;
}
g_activity_page.main_page.is_notif = activity_page->main_page.is_notif;
}
上面的结构体原型,以及函数实现,只是大体实现了个框架。后面我再一点一点的实现其过程,如何使用!