lvgl page manage 代码学习

2023-05-16


/**
 * @file lv_100ask_page_manager.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include "lv_100ask_page_manager.h"


#if LV_USE_100ASK_PAGE_MANAGER != 0


/*********************
 *      DEFINES
 *********************/
#define MY_CLASS &lv_100ask_page_manager_class
#define MY_PAGE_CLASS &lv_100ask_page_manager_page_class

/**********************
 *      TYPEDEFS
 **********************/


/**********************
 *  STATIC PROTOTYPES
 **********************/
static void lv_100ask_page_manager_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_100ask_page_manager_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_100ask_page_manager_event(const lv_obj_class_t * class_p, lv_event_t * e);

static void lv_100ask_page_manager_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_100ask_page_manager_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
static void lv_page_manager_load_page_event_cb(lv_event_t * e);
static void lv_100ask_page_manager_page_del_event_cb(lv_event_t * e);

static void page_close_anim_timeline_create(lv_anim_timeline_t * at, const lv_anim_timeline_wrapper_t * wrapper);
static void page_open_anim_timeline_create(lv_anim_timeline_t * at, const lv_anim_timeline_wrapper_t * wrapper);

#if LV_100ASK_PAGE_MANAGER_COSTOM_ANIMARION == 0
    static void defaule_open_page(lv_obj_t * obj);
    static void defaule_close_page(lv_obj_t * obj);
#endif

static void lv_obj_100ask_open_page_anim_start_cb(lv_anim_t * a);
static void lv_obj_100ask_open_page_anim_ready_cb(lv_anim_t * a);
static lv_obj_t * get_page(lv_obj_t * page_manager, char *name);
static char * get_page_name(lv_obj_t * page_manager, lv_obj_t * page);

/**********************
 *  STATIC VARIABLES
 **********************/
lv_obj_t * g_obj_page_manager = NULL;

const lv_obj_class_t lv_100ask_page_manager_class = {
    .constructor_cb = lv_100ask_page_manager_constructor,
    .destructor_cb = lv_100ask_page_manager_destructor,
    .event_cb = lv_100ask_page_manager_event,
    .width_def = LV_PCT(100),
    .height_def = LV_PCT(100),
    .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE,
    .instance_size = sizeof(lv_100ask_page_manager_t),
    .base_class = &lv_obj_class
};


const lv_obj_class_t lv_100ask_page_manager_page_class = {
    .constructor_cb = lv_100ask_page_manager_page_constructor,
    .destructor_cb = lv_100ask_page_manager_page_destructor,
    .width_def = LV_PCT(100),
    .height_def = LV_PCT(100),
    .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE,
    .instance_size = sizeof(lv_100ask_page_manager_page_t),
    .base_class = &lv_obj_class,
};

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

lv_obj_t * lv_100ask_page_manager_create(lv_obj_t * parent)
{
    LV_LOG_INFO("begin");
    lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
    lv_obj_class_init_obj(obj);
    return obj;
}

lv_obj_t * lv_100ask_page_manager_page_create(lv_obj_t * parent, char * name)
{
    LV_LOG_INFO("begin");
    lv_obj_t * obj = lv_obj_class_create_obj(&lv_100ask_page_manager_page_class, parent);
    lv_obj_class_init_obj(obj);

    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;
    page->name = name;

    return obj;
}

/*=====================
 * Other functions
 *====================*/
void lv_100ask_page_manager_open_previous_page(lv_obj_t * obj)
{
    LV_ASSERT_OBJ(obj, MY_CLASS);
    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)obj;

    lv_ll_t * history_ll = &(page_manager->history_ll);

    /* The current page */
    lv_100ask_page_manager_history_t * act_hist = _lv_ll_get_head(history_ll);

    /* The previous page */
    lv_100ask_page_manager_history_t * prev_hist = _lv_ll_get_next(history_ll, act_hist);

    if(prev_hist != NULL) {
        lv_100ask_page_manager_set_close_page(act_hist->page, NULL);
        /* Previous page exists */
        /* Delete the current item from the history */
        _lv_ll_remove(history_ll, act_hist);
        lv_mem_free(act_hist);
        page_manager->cur_depth--;

        /* Create the previous page.
        *  Remove it from the history because `lv_100ask_page_manager_set_open_page` will add it again */
        _lv_ll_remove(history_ll, prev_hist);
        page_manager->cur_depth--;
        lv_100ask_page_manager_set_open_page(prev_hist->page, NULL);

        lv_mem_free(prev_hist);
    }
}

/*=====================
 * Setter functions
 *====================*/

void lv_100ask_page_manager_set_main_page(lv_obj_t * obj, lv_obj_t * page)
{
    LV_ASSERT_OBJ(obj, MY_CLASS);
    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)obj;
    page_manager->main_page = page;
}

void lv_100ask_page_manager_set_page_init(lv_obj_t * obj, void (*init)(lv_obj_t  *page))
{
    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    page->init = init;
}

void lv_100ask_page_manager_set_open_page(lv_obj_t * obj, char *name)
{
    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)(g_obj_page_manager);
    lv_ll_t * history_ll = &(page_manager->history_ll);

    lv_100ask_page_manager_page_t * page;
    if (obj)
    {
        page = (lv_100ask_page_manager_page_t *)obj;
    }
    else if (name)
    {
        obj = get_page(g_obj_page_manager, name);
        page = (lv_100ask_page_manager_page_t *)obj;
    }
    else return;

    if (lv_obj_get_child_cnt(obj) == 0)
    {
        page->init(obj);
    }

    if(page->open_page)
        page->open_page(obj);

    /* del a new node */
    lv_100ask_page_manager_history_t * act_hist = _lv_ll_get_head(history_ll);
    if(act_hist != NULL)
        lv_100ask_page_manager_set_close_page(act_hist->page, NULL);

    /* Add a new node */
    lv_100ask_page_manager_history_t * new_node = _lv_ll_ins_head(history_ll);
    new_node->page = obj;
    page_manager->cur_depth++;
}

void lv_100ask_page_manager_set_close_page(lv_obj_t * obj, char *name)
{
    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)(g_obj_page_manager);

    lv_100ask_page_manager_page_t * page;

    if (obj)
    {
        page = (lv_100ask_page_manager_page_t *)obj;
    }
    else if (name)
    {
        obj = get_page(g_obj_page_manager, name);
        page = (lv_100ask_page_manager_page_t *)obj;
    }
    else return;

    if(page->close_page)
        page->close_page(obj);

    //lv_ll_t * history_ll = &(page_manager->history_ll);
    /* The current page */
    //lv_100ask_page_manager_history_t * act_hist = _lv_ll_get_head(history_ll);

    //_lv_ll_remove(history_ll, act_hist);
    //lv_mem_free(act_hist);
    //page_manager->cur_depth--;

}

void lv_100ask_page_manager_set_load_page_event(lv_obj_t * obj, lv_obj_t * page, char *name)
{
    /* Make the object clickable */
    lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE);

    /* Remove old event */
    if(lv_obj_remove_event_cb(obj, lv_page_manager_load_page_event_cb)) {
        lv_event_send(obj, LV_EVENT_DELETE, NULL);
        lv_obj_remove_event_cb(obj, lv_100ask_page_manager_page_del_event_cb);
    }

    if ((NULL == page) && (name != NULL))
    {
        page = get_page(g_obj_page_manager, name);
    }

    if (page)
    {
        lv_obj_add_event_cb(obj, lv_page_manager_load_page_event_cb, LV_EVENT_CLICKED, page);
        //lv_obj_add_event_cb(obj, lv_100ask_page_manager_page_del_event_cb, LV_EVENT_DELETE, page);
    }
}

void lv_100ask_page_manager_set_open_page_anim(lv_obj_t * obj, void (*open_anim)(lv_obj_t  * obj))
{
    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    page->open_page = open_anim;
}

void lv_100ask_page_manager_set_close_page_anim(lv_obj_t * obj, void (*close_anim)(lv_obj_t  * obj))
{
    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    page->close_page = close_anim;
}

/*=====================
 * Getter functions
 *====================*/

lv_obj_t * lv_100ask_page_manager_get_page(lv_obj_t * obj, char * name)
{
    LV_ASSERT_OBJ(obj, MY_CLASS);

    lv_obj_t * page = get_page(obj, name);

    return page;
}

char * lv_100ask_page_manager_get_page_name(lv_obj_t * obj, lv_obj_t * page)
{
    LV_ASSERT_OBJ(obj, MY_CLASS);
    LV_ASSERT_OBJ(page, MY_PAGE_CLASS);

    char * page_name = get_page_name(obj, page);

    return page_name;
}

/**********************
 *   STATIC FUNCTIONS
 **********************/
static void lv_100ask_page_manager_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
    LV_UNUSED(class_p);
    LV_TRACE_OBJ_CREATE("begin");

    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)obj;

    page_manager->cur_depth = 0;
    page_manager->prev_depth = 0;

    _lv_ll_init(&(page_manager->history_ll), sizeof(lv_100ask_page_manager_history_t));

    page_manager->main_page = NULL;
    g_obj_page_manager = obj;

    LV_TRACE_OBJ_CREATE("finished");
}

static void lv_100ask_page_manager_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
    LV_UNUSED(class_p);
    LV_TRACE_OBJ_CREATE("begin");

    lv_100ask_page_manager_t * page_manager = (lv_100ask_page_manager_t *)obj;
    lv_ll_t * history_ll = &(page_manager->history_ll);

    _lv_ll_clear(history_ll);

    g_obj_page_manager = NULL;

    LV_TRACE_OBJ_CREATE("finished");
}


static void lv_100ask_page_manager_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
    LV_UNUSED(class_p);

    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    page->anim_timeline = NULL;
    page->init = NULL;
#if LV_100ASK_PAGE_MANAGER_COSTOM_ANIMARION
    page->open_page = NULL;
    page->close_page = NULL;
#else
    page->open_page = defaule_open_page;
    page->close_page = defaule_close_page;
    page->close_page(obj);
#endif

}

static void lv_100ask_page_manager_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
{
    LV_UNUSED(class_p);

    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    if(page->name != NULL) {
        lv_mem_free(page->name);
        page->name = NULL;
    }
}

static void lv_page_manager_load_page_event_cb(lv_event_t * e)
{
    lv_obj_t * obj = lv_event_get_target(e);
    lv_obj_t * page = lv_event_get_user_data(e);

    lv_100ask_page_manager_set_open_page(page, NULL);
}

static void lv_100ask_page_manager_page_del_event_cb(lv_event_t * e)
{

}

static void lv_100ask_page_manager_event(const lv_obj_class_t * class_p, lv_event_t * e)
{
    LV_UNUSED(class_p);

    lv_res_t res;

    /*Call the ancestor's event handler*/
    res = lv_obj_event_base(MY_CLASS, e);
    if(res != LV_RES_OK) return;

    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_target(e);
}


#if LV_100ASK_PAGE_MANAGER_COSTOM_ANIMARION == 0
static void defaule_open_page(lv_obj_t * obj)
{
    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    if (page->anim_timeline) {
        lv_anim_timeline_set_reverse(page->anim_timeline, 1);
        lv_anim_timeline_start(page->anim_timeline);

        lv_anim_timeline_del(page->anim_timeline);
        page->anim_timeline = NULL;
    }

    /* Create anim timeline */
    page->anim_timeline = lv_anim_timeline_create();
    //lv_obj_refr_size(obj);
    //lv_obj_refr_pos(obj);
    lv_obj_update_layout(obj);

    lv_anim_timeline_wrapper_t wrapper = ANIM_DEF(400, obj, height, 0, lv_obj_get_height(obj));
    page_open_anim_timeline_create(page->anim_timeline, &wrapper);

    lv_anim_timeline_set_reverse(page->anim_timeline, 0);
    lv_anim_timeline_start(page->anim_timeline);
}


static void defaule_close_page(lv_obj_t * obj)
{
    lv_100ask_page_manager_page_t * page = (lv_100ask_page_manager_page_t *)obj;

    if (page->anim_timeline) {
        lv_anim_timeline_del(page->anim_timeline);
        page->anim_timeline = NULL;
    }

    /* Create anim timeline */
    page->anim_timeline = lv_anim_timeline_create();
    //lv_obj_refr_size(obj);
    //lv_obj_refr_pos(obj);
    lv_obj_update_layout(obj);

    lv_anim_timeline_wrapper_t wrapper = ANIM_DEF(300, obj, y, -lv_obj_get_height(obj), 0);
    page_close_anim_timeline_create(page->anim_timeline, &wrapper);

    lv_anim_timeline_set_reverse(page->anim_timeline, 1);
    lv_anim_timeline_start(page->anim_timeline);
}
#endif

static void page_open_anim_timeline_create(lv_anim_timeline_t * at, const lv_anim_timeline_wrapper_t * wrapper)
{
    const lv_anim_timeline_wrapper_t * atw = wrapper;

    /* anim */
    lv_anim_t anim;
    lv_anim_init(&anim);
    lv_anim_set_var(&anim, atw->obj);
    lv_anim_set_values(&anim, atw->start, atw->end);
    lv_anim_set_early_apply(&anim, atw->early_apply);
    lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)atw->exec_cb);
    lv_anim_set_path_cb(&anim, atw->path_cb);
    lv_anim_set_start_cb(&anim, lv_obj_100ask_open_page_anim_start_cb);
    lv_anim_set_time(&anim, atw->duration);

    lv_anim_timeline_add(at, atw->start_time, &anim);
}

static void page_close_anim_timeline_create(lv_anim_timeline_t * at, const lv_anim_timeline_wrapper_t * wrapper)
{
    const lv_anim_timeline_wrapper_t * atw = wrapper;

    /* anim */
    lv_anim_t anim;
    lv_anim_init(&anim);
    lv_anim_set_var(&anim, atw->obj);
    lv_anim_set_values(&anim, atw->start, atw->end);
    lv_anim_set_early_apply(&anim, atw->early_apply);
    lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)atw->exec_cb);
    lv_anim_set_path_cb(&anim, atw->path_cb);
    lv_anim_set_time(&anim, atw->duration);

#if LV_100ASK_PAGE_MANAGER_SW_DEL_PAGE
    lv_anim_set_ready_cb(&anim, lv_obj_100ask_open_page_anim_ready_cb);
#endif

    lv_anim_timeline_add(at, atw->start_time, &anim);
}


static lv_obj_t * get_page(lv_obj_t * page_manager, char *name)
{
    uint32_t i;
    for(i = 0; i < lv_obj_get_child_cnt(page_manager); i++) {
        lv_obj_t * child = lv_obj_get_child(page_manager, i);
        lv_100ask_page_manager_page_t * page_manager_page = (lv_100ask_page_manager_page_t *)child;
        if (strcmp(name, page_manager_page->name) == 0)
        {
            return child;
            break;
        }
    }
    return NULL;
}


static char * get_page_name(lv_obj_t * page_manager, lv_obj_t * page)
{
    uint32_t i;
    for(i = 0; i < lv_obj_get_child_cnt(page_manager); i++) {
        lv_obj_t * child = lv_obj_get_child(page_manager, i);
        lv_100ask_page_manager_page_t * page_manager_page = (lv_100ask_page_manager_page_t *)child;
        if (page == child)
        {
            return page_manager_page->name;
            break;
        }
    }
    return NULL;
}

static void lv_obj_100ask_open_page_anim_start_cb(lv_anim_t * a)
{
    lv_obj_t * obj = (lv_obj_t *)a->var;
    lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN);
}


static void lv_obj_100ask_open_page_anim_ready_cb(lv_anim_t * a)
{
    lv_obj_t * obj = (lv_obj_t *)a->var;
#if LV_100ASK_PAGE_MANAGER_SW_DEL_PAGE
    lv_obj_clean(obj);
#else
    lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
#endif
}
#endif  /*LV_USE_100ASK_PAGE_MANAGER*/
 

============================================================

/**
 * @file lv_100ask_page_manager.h
 *
 */

#ifndef LV_100ASK_PAGE_MANAGER_H
#define LV_100ASK_PAGE_MANAGER_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
 *      INCLUDES
 *********************/
#include "../../lv_lib_100ask.h"

#if LV_USE_100ASK_PAGE_MANAGER != 0

/*********************
 *      DEFINES
 *********************/
#define LV_ANIM_EXEC(attr)      (lv_anim_exec_xcb_t)lv_obj_set_##attr

#define ANIM_DEF(start_time, obj, attr, start, end) \
        {start_time, obj, LV_ANIM_EXEC(attr), start, end, 400, lv_anim_path_overshoot, true}

#define LV_ANIM_TIMELINE_WRAPPER_END {0, NULL}


/**********************
 *      TYPEDEFS
 **********************/

typedef struct {
    lv_obj_t obj;
    lv_obj_t * main_page;
    lv_ll_t history_ll;
    uint8_t cur_depth;
    uint8_t prev_depth;
} lv_100ask_page_manager_t;

typedef struct {
    lv_obj_t obj;
    char * name;
    lv_anim_timeline_t * anim_timeline;
    void (*init)(lv_obj_t * obj);
    void (*open_page)(lv_obj_t * obj);
    void (*close_page)(lv_obj_t * obj);

} lv_100ask_page_manager_page_t;

typedef struct {
    lv_obj_t * page;
} lv_100ask_page_manager_history_t;

/*Data of anim_timeline*/
typedef struct {
    uint32_t start_time;
    lv_obj_t *obj;
    lv_anim_exec_xcb_t exec_cb;
    int32_t start;
    int32_t end;
    uint16_t duration;
    lv_anim_path_cb_t path_cb;
    bool early_apply;
} lv_anim_timeline_wrapper_t;

/***********************
 * GLOBAL VARIABLES
 ***********************/

/**********************
 * GLOBAL PROTOTYPES
 **********************/

lv_obj_t * lv_100ask_page_manager_create(lv_obj_t * parent);

/*=====================
 * Setter functions
 *====================*/

void lv_100ask_page_manager_set_main_page(lv_obj_t * obj, lv_obj_t * page);

void lv_100ask_page_manager_set_page_init(lv_obj_t * obj, void (*init)(lv_obj_t  *page));

void lv_100ask_page_manager_set_open_page(lv_obj_t * obj, char *name);

void lv_100ask_page_manager_set_close_page(lv_obj_t * obj, char *name);

void lv_100ask_page_manager_set_load_page_event(lv_obj_t * obj, lv_obj_t * page, char *name);

void lv_100ask_page_manager_set_open_page_anim(lv_obj_t * obj, void (*open_anim)(lv_obj_t  * obj));

void lv_100ask_page_manager_set_close_page_anim(lv_obj_t * obj, void (*close_anim)(lv_obj_t  * obj));

/*=====================
 * Getter functions
 *====================*/
lv_obj_t * lv_100ask_page_manager_get_page(lv_obj_t * obj, char * name);

char * lv_100ask_page_manager_get_page_name(lv_obj_t * obj, lv_obj_t * page);


/*=====================
 * Other functions
 *====================*/

lv_obj_t * lv_100ask_page_manager_page_create(lv_obj_t * parent, char * name);

void lv_100ask_page_manager_open_previous_page(lv_obj_t * obj);

/**********************
 *      MACROS
 **********************/

#endif  /*LV_USE_100ASK_PAGE_MANAGER*/

#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif /*LV_100ASK_PAGE_MANAGER_H*/
 

========================================================


/**
 * @file simple_test.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include "simple_test.h"

#if LV_100ASK_PAGE_MANAGER_SIMPLE_TEST != 0

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/
static void init_main_page(lv_obj_t * page);
static void init_page1(lv_obj_t * page);
static void init_page2(lv_obj_t * page);
static void init_page3(lv_obj_t * page);
static void init_page4(lv_obj_t * page);
static void init_page5(lv_obj_t * page);
static void init_page6(lv_obj_t * page);
static void open_page_anim(lv_obj_t * obj);
static void close_page_anim(lv_obj_t * obj);
/**********************
 *  STATIC VARIABLES
 **********************/


/**********************
 *      MACROS
 **********************/


/**********************
 *   GLOBAL FUNCTIONS
 **********************/


void lv_100ask_page_manager_simple_test(void)
{
    lv_obj_t * page_manager = lv_100ask_page_manager_create(lv_scr_act());

    lv_obj_t * main_page = lv_100ask_page_manager_page_create(page_manager, "Main_page");
    lv_obj_t * page1 = lv_100ask_page_manager_page_create(page_manager, "Page1");
    lv_obj_t * page2 = lv_100ask_page_manager_page_create(page_manager, "Page2");
    lv_obj_t * page3 = lv_100ask_page_manager_page_create(page_manager, "Page3");
    lv_obj_t * page4 = lv_100ask_page_manager_page_create(page_manager, "Page4");
    lv_obj_t * page5 = lv_100ask_page_manager_page_create(page_manager, "Page5");
    lv_obj_t * page6 = lv_100ask_page_manager_page_create(page_manager, "Page6");

    lv_100ask_page_manager_set_page_init(main_page, init_main_page);
    lv_100ask_page_manager_set_page_init(page1, init_page1);
    lv_100ask_page_manager_set_page_init(page2, init_page2);
    lv_100ask_page_manager_set_page_init(page3, init_page3);
    lv_100ask_page_manager_set_page_init(page4, init_page4);
    lv_100ask_page_manager_set_page_init(page5, init_page5);
    lv_100ask_page_manager_set_page_init(page6, init_page6);

#if LV_100ASK_PAGE_MANAGER_COSTOM_ANIMARION
    lv_100ask_page_manager_set_open_page_anim(main_page, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(main_page, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page1, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page1, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page2, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page2, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page3, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page3, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page4, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page4, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page5, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page5, close_page_anim);
    lv_100ask_page_manager_set_open_page_anim(page6, open_page_anim);
    lv_100ask_page_manager_set_close_page_anim(page6, close_page_anim);
#endif

    lv_100ask_page_manager_set_main_page(page_manager, main_page);
    lv_100ask_page_manager_set_open_page(NULL, "Main_page");
}


/*=====================
 * Other functions
 *====================*/

/**********************
 *   STATIC FUNCTIONS
 **********************/
#if LV_100ASK_PAGE_MANAGER_COSTOM_ANIMARION
/*open page anim*/
static void open_page_anim(lv_obj_t * obj)
{
    /*Do something with LVGL*/
    LV_LOG_USER("open page anim.");
    lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN);
}

/*close page anim*/
static void close_page_anim(lv_obj_t * obj)
{
    /*Do something with LVGL*/
    LV_LOG_USER("close page anim.");
    lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
}
#endif

static void btn_event_handler(lv_event_t * e)
{
    lv_obj_t * page = (lv_obj_t *)lv_event_get_user_data(e);
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_CLICKED) {
        LV_LOG_USER("Clicked");
        lv_100ask_page_manager_open_previous_page(lv_obj_get_parent(page));
    }
}


/* main page */
static void init_main_page(lv_obj_t * page)
{
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_flex_flow(&style, LV_FLEX_FLOW_ROW_WRAP);
    lv_style_set_flex_main_place(&style, LV_FLEX_ALIGN_SPACE_EVENLY);
    lv_style_set_layout(&style, LV_LAYOUT_FLEX);

    lv_obj_t * cont = lv_obj_create(page);
    lv_obj_set_size(cont, LV_PCT(95), LV_PCT(20));
    lv_obj_center(cont);
    lv_obj_add_style(cont, &style, 0);

    uint32_t i;
    for(i = 0; i < 6; i++) {
        lv_obj_t * obj = lv_btn_create(cont);
        lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_PCT(100));

        lv_obj_t * label = lv_label_create(obj);
        lv_label_set_text_fmt(label, "Page%d", i+1);
        lv_obj_center(label);

        lv_100ask_page_manager_set_load_page_event(obj, NULL, lv_label_get_text(label));
    }
}

/* page 1 */
static void init_page1(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 1");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page2");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page2");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page3");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page3");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page);  
}


/* page 2 */
static void init_page2(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 2");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page3");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page3");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page4");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page4");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page); 

}


/* page 3*/

static void init_page3(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 3");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page5");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page5");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page6");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page6");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page); 
}

/* page 4*/
static void init_page4(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 4");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page2");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page2");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page3");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page3");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page); 
}

/*page 5*/
static void init_page5(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 5");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page6");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page6");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page1");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page1");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page); 
}

/*page 6*/
static void init_page6(lv_obj_t * page)
{
    lv_obj_t * page_label = lv_label_create(page);
    lv_label_set_text(page_label, "You are browsing page 6");
    lv_obj_center(page_label);

    lv_obj_t * btn1 = lv_btn_create(page);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_align_to(btn1, page_label, LV_ALIGN_OUT_BOTTOM_MID, 80, 20);

    lv_obj_t * label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Open Page1");
    lv_obj_center(label1);

    lv_100ask_page_manager_set_load_page_event(btn1, NULL, "Page1");

    lv_obj_t * btn2 = lv_btn_create(page);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_align_to(btn2, page_label, LV_ALIGN_OUT_BOTTOM_MID, -80, 20);

    lv_obj_t * label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Open Page4");
    lv_obj_center(label2);

    lv_100ask_page_manager_set_load_page_event(btn2, NULL, "Page4");

    lv_obj_t * back_btn = lv_btn_create(page);
    lv_obj_add_event_cb(back_btn, btn_event_handler, LV_EVENT_CLICKED, page); 
}

#endif  /*SIMPLE_TEST*/
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lvgl page manage 代码学习 的相关文章

  • linux/mm/memory.c/put_page

    put page用来完成物理页面与一个线性地址页面的挂接 xff0c 从而将一个 线性地址空间内的页面落实到物理地址空间内 xff0c copy page tables函数 只是为一个进程提供了在线性地址空间的一个页表及1024页内存 xf
  • linux/mm/memory.c/do_wp_page and un_wp_page

    void do wp page unsigned long error code unsigned long address if 0 we cannot do this yet the estdio library writes to c
  • xv6---Lab3: page tables

    目录 参考资料 RISC V页表的简化图如下所示 编辑 多级页表 xv6内核页表 3 6 Process Address Space 3 7 Code Sbrk 3 8 Code Exec Print a page table A kern
  • Flush-Cache/Page-Lock/Flush-TLB说明

    Flush Cache Page Lock Flush TLB说明 理论上顺序 xff1a 获得页面锁 xff0c 保证后续flush操作完成之前不允许继续读写Flush cacheFlush tlb 以下用numa migrate pag
  • page_cleaner

    MySQL Error Log 中IO写入瓶颈的警告分析 在一台MySQL实例上频繁做大批量的写入测试 xff0c 无意中发现MySQL的errorlog中频繁出现如下的Note xff1a page cleaner 1000ms inte
  • LVGL 优化帧率技巧

    目录标题 前文未优化版本LVGL帧率限制刷屏方法效率代码优化等级编译器版本LVGL显存单buffer非全尺寸双buffer全尺寸双buffer 本文只针对当时的LVGL v7 xff0c LVGL迭代过程中变化较大 xff0c 部分接口有可
  • arduino-esp32:LVGL中文字库(通用)

    导航 概述 系统自带中文字库 使用自带中文字库 制作专属字库 使用专属字库 VS模拟器 效果 arduino esp32 效果 小结 概述 标题是arduino esp32只是因为平台是这个 LVGL默认的字库是英文的 当然其字库文件里也有
  • LVGL学习笔记

    文章目录 前言 一 软件安装 1 VSCode安装 2 MSYS2安装 二 配置环境 1 添加环境变量 2 配置msys2环境 3 配置VSCode 三 运行lvgl示例 前言 最近需要使用LittlevGL 以下简称lvgl 做ARM开发
  • 【esp32&lvgl】-2.1 # esp32移植lvgl7驱动st7789屏幕(ESP-IDF框架)

    目录 一 前言 二 代码 三 硬件说明 四 ESP IDF设置 重要 五 屏幕偏移修改驱动文件 参考资料 一 前言 前几天在ardiuno框架下基于platformIO用TFT eSPI库实现了lvgl库的移植 这种方法虽然在lvgl的版本
  • RV1109 LVGL UI开发

    RV1109 LVGL UI开发 前面在使用RK的RV1109平台用于产品中 使用的是QT做的UI 主要是继承原来海思平台的产品 随着分辨率的提高 UI响应也慢了不少 试着在RV1109上使用LVGL看看效果如何 RV1109使用的是DRM
  • 【LVGL 学习】COLOR 常用接口函数说明

    COLOR 接口常用函数说明 通常跟样式 style 接口函数搭配使用 文件位置 src misc lv color c lv palette t 枚举包含以下18种 LV PALETTE RED LV PALETTE PINK LV PA
  • LVGL学习笔记6 - 输入设备

    目录 1 移植文件 2 移除多余代码 3 输入设备初始化 4 输入设备读回调函数 4 1 LV INDEV TYPE POINTER 4 2 LV INDEV TYPE KEYPAD 4 3 LV INDEV TYPE ENCODER 4
  • 把握linux内核设计思想(十一):内存管理之页的分配与回收

    版权声明 尊重原创 转载请保留出处 blog csdn net shallnet 文章仅供学习交流 请勿用于商业用途 内存管理单元 MMU 负责将管理内存 在把虚拟地址转换为物理地址的硬件的时候是按页为单位进行处理 从虚拟内存的角度来看 页
  • LVGL 源码分析大全

    LVGL 源码分析大全目录 1 概述 2 已完成源码分析文章列表 2 1 硬件抽像层 hal 2 2 核心框架 core misc 2 3 定制功能 2 4 内部接口 2 5 案例讲解 2 6 其它 3 样式 4 组件 5 主题 6 开发环
  • GUI Guider设计UI界面移植到STM32

    GUI Guider设计UI界面移植到STM32 一 什么是GUI Guider 什么是 GUI Guider GUI Guider 是恩智浦为 LVGL 开发了一个上位机GUI 设计工具 可以通过拖放控件的方式设计 LVGL GUI 页面
  • 【LVGL】ANIM(动画)学习

    animate 通用动画 过渡动画与通用动画的区别 过渡动画只有在状态发生改变时发生 通用动画可以在任意时刻进行 过渡动画支是样式 style 的一部分 通用动画和样式是相互独立的 实际上 过渡的底层也使用的是动画 创建动画 为了创建动画
  • 【GUI】LVGL8内存泄漏分析

    LVGL版本 V8 0 2 平台 ESP32S3 在调试过程中 发现有两个界面 在重复退出再进入时内存会不断增加的吃内存现象 然后做了分析和研究 1 样式style吃内存 在主页面 进入simple页面 再退出到主页面 再次进入simple
  • 【LVGL 学习】样式(style)过渡动画学习

    transition 过渡动画 当一个控件的状态发生改变时 可以让样式也发生变化以提醒用户 通过过渡动画 transition 可以让样式的改变更自然 例如 按钮在点击时 以及开关在切换时 都具有一小段的过渡动画 过渡动画使用 lv sty
  • LVGL V8学习之键盘按键样式重绘(二)

    这一篇继续研究一下基于btnmatrix的键盘按键重绘 是对上一篇LVGL V8学习之键盘按键样式重绘 一 的代码的优化 还是通过codeblock来模拟代码的运行 代码如下 按键矩阵的事件回调函数 static void btnmatri
  • LVGL V8应用——实现互斥

    按键互斥 void language setup lv obj t cont lv obj create page lv obj set size cont 320 160 lv obj t ch cb lv checkbox create

随机推荐

  • Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿)

    第7章 MapReduce进阶 7 1 MapReduce过程 7 1 1 input 一般而言 xff0c 数据文件都会上传到HDFS上 xff0c 也就是说HDFS上的文件作为MapReduce的输入 已知block块大小是128M x
  • RedHat Linux 5企业版开启VNC Server远程桌面功能手记

    环境 xff1a RedHat Linux 5企业版 Xwindows xff1a gnome xff08 红帽默认安装的图形界面 xff09 尽管我们可以使用SSH连接远程通过字符界面来操作Linux xff0c 但是对于更多熟悉图形人来
  • man: can't change directory to '/root': Permission denied

    执行 man 命令报错 man can t change directory to root Permission denied man command exited with status 255 sed e 错误原因 用户权限不够 解决
  • 树莓派3B入门开发之(一)--简介

    介绍 树莓派3B 树莓派是一个小型的单板计算机 通过将键盘 xff0c 鼠标 xff0c 显示器等外围设备连接到Raspberry Pi xff0c 它将作为一台迷你个人电脑 Raspberry Pi广泛用于实时图像 视频处理 xff0c
  • 3.19、BI之SSIS之数据流转换(合并)

    BI之SSIS之数据流转换 xff08 Union xff09 1 使用 合并 前必须先对数据进行排序 xff0c 否则会报错 xff0c 而union all则不需要排序 xff0c 这是它们二者的区别 2 新建SSIS包 3 控制流 拖
  • 3.20、BI之SSIS之数据流转换(合并连接)

    BI之SSIS之数据流转换 xff08 合并连接 xff09 1 合并联接转换功能是将两个已排序的输入列的数据通过使用FULL JOIN Left JOIN或INNERR JOIN联接形成一个输出数据集 它类似于T SQL语句中的连接查询语
  • 缓存小技巧--异步更新缓存时remove cache数据

    在支撑大规模 高并发 高可用的互联网应用中 xff0c 异步更新分布式缓存的应用已经越来越多了 xff08 为什么是异步更新缓存 xff0c 因为异步不仅可以提高系统性能 xff0c 而且提高系统的伸缩性和可用性 xff09 xff0c 由
  • pixhawk 2.4.6 pix2.4.8 原理图PCB二层板

    pixhawk 2 4 6 pix2 4 8 原理图PCB二层板 www cirmall com circuit 21579
  • Dockerfile简单使用入门

    什么是 Dockerfile xff1f Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说明 docker build命令用于从Dockerfile构建映像 可以在docker bu
  • 什么是私有云?您应该知道的 6 个优势

    私有云是指单个业务实体或目标用户可以单独访问特定云计算环境中指定的硬件和软件资源 私有云类似于其他形式的云环境 xff0c 因为它通过物理组件提供虚拟化资源 私有云的优势 私有云的六大主要优势包括可预测的服务器使用 提高资源利用率 降低成本
  • CORD 4.1:打造实现边缘计算的最佳平台

    开放网络基金会 xff08 ONF xff09 周一发布了CORD 4 1版本的代码 xff0c 该版本的代码新增的功能为CORD项目注入了新的活力 xff0c 该版本是CORD项目独立一年半以来发布的一个重要的版本 xff0c 本次版本的
  • linux 查看动态库和可执行程序依赖库

    Linux动态库 一 objdump二 readelf三 ldd四 进程是否依赖指定五 动态库搜索路径顺序 一 objdump span class token comment 查看依赖的库 span objdump x xxx so sp
  • putty远程连接linux显示连接超时

    这个问题可真坑爹啊 一开始我百度谷歌了老长时间 xff0c ping一下也没有问题 xff0c 原来是关电脑后虚拟机的ip会发生变化 xff0c 重新连接就好了 xff0c 希望对大家有所帮助
  • Ubuntu 14.04安装openssh7.5

    因公司系统上线 xff0c 客户方 xff08 中国电信 xff09 入网需要系统安全评估报告 xff0c 根据第三方公司测试 xff0c 测出openssh有远程漏洞 xff0c 第三方测试公司提出整改建议 xff0c 升级最新的open
  • ovs测试vlan

    ovs端口默认是trunk模式 xff0c 且所有的VLAN tag都可以通过 单个网桥实现vlan隔离的场景 实验拓扑如下 xff1a 1 首先创建一个网桥ovs switch xff0c 在命名空间里创建两个接口p0和p1 分别分配地址
  • [STM32CubeIDE]FreeRTOS创建线程的方法

    1 在Device Configuration Tool 中 xff0c 依次选择Pinout amp Configuration gt Categories gt Middleware gt FREERTOS interface 选择CM
  • [STM32CubeIDE]使用freertos时Timebase Source为什么不能设定为SysTick

    参考https www digikey com en maker projects getting started with stm32 introduction to freertos ad275395687e4d85935351e16e
  • [CMSIS-RTOS2]rtos 基本概念

    特点 xff1a 利于采用更加面向对象的设计方法 多任务处理 相较于过程化的C xff0c 需要考虑的是任务线程设计及线程间的数据流 有助于项目管理 代码重用和软件测试 rtos需要额外的内存 xff0c 中断响应变慢 基本元素 xff1a
  • lvgl 2048 sample

    64 file simple test c INCLUDES include 34 simple test h 34 if LV 100ASK 2048 SIMPLE TEST 61 0 DEFINES TYPEDEFS
  • lvgl page manage 代码学习

    64 file lv 100ask page manager c INCLUDES include 34 lv 100ask page manager h 34 if LV USE 100ASK PAGE MANAGER 61 0 DEFI