开关控件
开关控件是一个自定义的开关按钮控件,常用于启用或禁用某些功能或选项,允许开发者通过切换按钮的状态来控制应用程序的行为。
用法
创建控件
开发者可以调用 gui_switch_t * gui_switch_create(parent, x, y, w, h, off_pic, on_pic) 或者 gui_switch_create_from_ftl(void *parent, int16_t x, int16_t y, int16_t w, int16_t h, void *off_pic, void *on_pic)从内存地址创建开关控件,使用gui_switch_t * gui_switch_create_frome_fs(parent, x, y, w, h, off_pic, on_pic) 从文件系统创建开关控件。 可以参考gui_switch_t中的具体参数,例如base、switch_picture、on_pic_addr、off_pic_addr等。
开关控件的参数
struct gui_switch
{
    gui_obj_t base;
    gui_img_t *switch_picture;
    void *on_pic_addr;
    void *off_pic_addr;
    void *on_hl_pic_addr;
    void *off_hl_pic_addr;
    void *long_touch_state_pic_addr;
    void *long_touch_state_hl_pic_addr;
    void *data;
    gui_animate_t *animate;             //!< can set animation
    IMG_SOURCE_MODE_TYPE src_mode;
    char style;
    uint32_t ifon : 1;
    uint32_t long_touch_state : 1;
    uint32_t long_touch_enable : 1;
    uint32_t press_flag : 1;
    uint32_t long_flag : 1;
    uint32_t release_flag : 1;
    uint32_t touch_disable : 1;
    uint32_t checksum : 8;
};
开/关
开发者可以使用以下API来打开或关闭开关控件,并触发事件(由gui_obj_add_event_cb创建)。
gui_switch_turn_on(gui_switch_t *this) 或者 gui_switch_turn_off(gui_switch_t *this)。
更新开关状态
如果已经打开/关闭了开关控件,开发者可以通过以下API将状态更新为打开或关闭。
gui_switch_is_on(gui_switch_t *this) 或者 gui_switch_is_off(gui_switch_t *this)。
改变开关控件状态
开发者可以调用 gui_switch_change_state(gui_switch_t *this, bool ifon)来设置开关控件的状态并改变UI,但不会触发任何事件(由gui_obj_add_event_cb创建)。
示例
示例代码
#include "root_image_hongkong/ui_resource.h"
#include "gui_switch.h"
#include "gui_img.h"
static gui_img_t *img;
static void img_animate(gui_img_t *img)
{
    gui_log("%f\n", img->animate->progress_percent);
    if (img->animate->progress_percent < 0.5f)
    {
        GET_BASE(img)->y = img->animate->progress_percent * 2 * 100 - 100;
    }
    else if (img->animate->progress_percent >= 0.5f)
    {
        GET_BASE(img)->y = (1 - img->animate->progress_percent) * 2 * 100 - 100;
    }
    if (img->animate->progress_percent == 1.0f)
    {
        img->animate->current_repeat_count = 0;
        img->base.not_show = true;
    }
}
static void reset_animate()
{
    img->animate->animate = true;
    img->base.not_show = false;
    img->animate->current_frame = 0;
    img->animate->current_repeat_count = 0;
    img->animate->progress_percent = 0;
}
static void callback_disturb_on()
{
    reset_animate();
    img->draw_img->data = WURAOKAI_BIN;
}
static void callback_disturb_off()
{
    reset_animate();
    img->draw_img->data = WURAOGUAN_BIN;
}
static void callback_mute_on()
{
    reset_animate();
    img->draw_img->data = JINGYINKAI_BIN;
}
static void callback_mute_off()
{
    reset_animate();
    img->draw_img->data = JINGYINGUAN_BIN;
}
static void callback_call_on()
{
    reset_animate();
    img->draw_img->data = DIANHUAKAI_BIN;
}
static void callback_call_off()
{
    reset_animate();
    img->draw_img->data = DIANHUAGUAN_BIN;
}
static void callback_bright_on()
{
    reset_animate();
    img->draw_img->data = LIANGDUKAI_BIN;
}
static void callback_bright_off()
{
    reset_animate();
    img->draw_img->data = LIANGDUGUAN_BIN;
}
static void callback_watch_on()
{
    reset_animate();
    img->draw_img->data = SHIZHONGKAI_BIN;
}
static void callback_watch_off()
{
    reset_animate();
    img->draw_img->data = SHIZHONGGUAN_BIN;
}
static void callback_set_on()
{
    reset_animate();
    img->draw_img->data = SHEZHIKAI_BIN;
}
static void callback_set_off()
{
    reset_animate();
    img->draw_img->data = SHEZHIGUAN_BIN;
}
void page_tb_control0(void *parent)
{
    // gui_img_creat_from_mem(parent, "parent", CONTROLMENU_0_BIN, 0, 0, 0, 0);
    gui_switch_t *sw_no_disturb  = gui_switch_create(parent, 10, 108, 169, 98, NO_DISTURB_OFF_BIN,
                                                     NO_DISTURB_ON_BIN);
    gui_switch_t *sw_mute        = gui_switch_create(parent, 190, 108, 169, 98, MUTE_OFF_BIN,
                                                     MUTE_ON_BIN);
    gui_switch_t *sw_call        = gui_switch_create(parent, 10, 220, 169, 98, CALL_OFF_BIN,
                                                     CALL_ON_BIN);
    gui_switch_t *sw_bright      = gui_switch_create(parent, 190, 220, 169, 98, BRIGHT_OFF_BIN,
                                                     BRIGHT_ON_BIN);
    gui_switch_t *sw_watch       = gui_switch_create(parent, 10, 332, 169, 98, WATCH_OFF_BIN,
                                                     WATCH_ON_BIN);
    gui_switch_t *sw_set         = gui_switch_create(parent, 190, 332, 169, 98, SET_OFF_BIN,
                                                     SET_ON_BIN);
    img =  gui_img_create_from_mem(GET_BASE(parent)->parent, 0, WURAOKAI_BIN, 0, 0, 0, 0);
    gui_img_set_animate(img, 1000, 1, img_animate, img);
    img->animate->animate = false;
    img->base.not_show = true;
    gui_obj_add_event_cb(sw_no_disturb, (gui_event_cb_t)callback_disturb_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_no_disturb, (gui_event_cb_t)callback_disturb_off, GUI_EVENT_2, NULL);
    gui_obj_add_event_cb(sw_mute, (gui_event_cb_t)callback_mute_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_mute, (gui_event_cb_t)callback_mute_off, GUI_EVENT_2, NULL);
    gui_obj_add_event_cb(sw_call, (gui_event_cb_t)callback_call_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_call, (gui_event_cb_t)callback_call_off, GUI_EVENT_2, NULL);
    gui_obj_add_event_cb(sw_bright, (gui_event_cb_t)callback_bright_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_bright, (gui_event_cb_t)callback_bright_off, GUI_EVENT_2, NULL);
    gui_obj_add_event_cb(sw_watch, (gui_event_cb_t)callback_watch_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_watch, (gui_event_cb_t)callback_watch_off, GUI_EVENT_2, NULL);
    gui_obj_add_event_cb(sw_set, (gui_event_cb_t)callback_set_on, GUI_EVENT_1, NULL);
    gui_obj_add_event_cb(sw_set, (gui_event_cb_t)callback_set_off, GUI_EVENT_2, NULL);
}

API
Defines
- 
SWITCH_HIGHLIGHT_ARRAY
Enums
Functions
- 
gui_switch_t *gui_switch_create(void *parent, int16_t x, int16_t y, int16_t w, int16_t h, void *off_pic, void *on_pic)
- create a switch widget, file source is memory address. - 参数:
- parent – the father widget it nested in. 
- x – the X-axis coordinate of the widget. 
- y – the Y-axis coordinate of the widget. 
- w – the width of the widget. 
- h – the hight of the widget. 
- off_pic – off status image memory address. 
- on_pic – on status image memory address. 
 
- 返回:
- return the widget object pointer. 
 
- 
gui_switch_t *gui_switch_create_from_fs(void *parent, int16_t x, int16_t y, int16_t w, int16_t h, void *off_pic, void *on_pic)
- create a switch widget, file source is filesystem. - 参数:
- parent – the father widget it nested in. 
- x – the X-axis coordinate of the widget. 
- y – the Y-axis coordinate of the widget. 
- w – the width of the widget. 
- h – the hight of the widget. 
- off_pic – off status image filepath. 
- on_pic – on status image filepath. 
 
- 返回:
- return the widget object pointer. 
 
- 
gui_switch_t *gui_switch_create_from_ftl(void *parent, int16_t x, int16_t y, int16_t w, int16_t h, void *off_pic, void *on_pic)
- create a switch widget, file source is memory address - 参数:
- parent – the father widget it nested in. 
- x – the X-axis coordinate of the widget. 
- y – the Y-axis coordinate of the widget. 
- w – the width of the widget. 
- h – the hight of the widget. 
- off_pic – off status image filepath. 
- on_pic – on status image filepath. 
 
- 返回:
- return the widget object pointer. 
 
- 
void gui_switch_turn_on(gui_switch_t *this)
- Turn on the switch, event will be triggered. - 参数:
- this – 
 
 
- 
void gui_switch_turn_off(gui_switch_t *this)
- Turn off the switch, event will be triggered. - 参数:
- this – 
 
 
- 
void gui_switch_is_on(gui_switch_t *this)
- If the switch has been turned on somehow, it can upadte the status to on status. - 参数:
- this – 
 
 
- 
void gui_switch_is_off(gui_switch_t *this)
- If the switch has been turned off somehow, it can upadte the status to off status. - 参数:
- this – 
 
 
- 
void gui_switch_change_state(gui_switch_t *this, bool ifon)
- set sw state and change ui, NO event will be trigered. - 参数:
- this – 
- ifon – set sw state 
 
 
Variables
- 
void (*turn_off)(gui_switch_t *sw)
- 
void (*turn_on)(gui_switch_t *sw)
- 
void (*on_turn_on)(gui_switch_t *this, void *cb, void *p)
- 
void (*on_turn_off)(gui_switch_t *this, void *cb, void *p)
- 
void (*on_press)(gui_switch_t *this, gui_event_cb_t event_cb, void *parameter)
- 
void (*on_release)(gui_switch_t *this, gui_event_cb_t event_cb, void *parameter)
- 
void (*ctor)(gui_switch_t *this, gui_obj_t *parent, int16_t x, int16_t y, int16_t w, int16_t h, void *off_pic, void *on_pic)
- 
void (*animate)(gui_switch_t *this, uint32_t dur, int repeat_count, void *callback, void *p)
- 
struct gui_switch
- #include <gui_switch.h>Public Members - 
void *on_pic_addr
 - 
void *off_pic_addr
 - 
void *on_hl_pic_addr
 - 
void *off_hl_pic_addr
 - 
void *long_touch_state_pic_addr
 - 
void *long_touch_state_hl_pic_addr
 - 
void *data
 - 
gui_animate_t *animate
- can set animation 
 - 
IMG_SOURCE_MODE_TYPE src_mode
 - 
char style
 - 
uint32_t ifon
 - 
uint32_t long_touch_state
 - 
uint32_t long_touch_enable
 - 
uint32_t press_flag
 - 
uint32_t long_flag
 - 
uint32_t release_flag
 - 
uint32_t touch_disable
 - 
uint32_t checksum
 
- 
void *on_pic_addr