lv_btnmatrix
lv_btnmatrix不是真正的lv_btn按钮对象,但是有和lv_btn一样的点击效果,绘出相同按钮下比lv_btn占用内存小。
lv_btnmatrix可以设置每个按钮文本标题、相对大小、属性
属性类型
/** Type to store button control bits (disabled, hidden etc.)
* The first 3 bits are used to store the width */
enum {
LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< 设置按钮为隐藏不可见状态 */
LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< 设置按钮不具有重复长按的动作效果 */
LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< 设置按钮为禁用状态 */
LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< 设置按钮为 Toggle 切换按钮 */
LV_BTNMATRIX_CTRL_CHECK_STATE = 0x0080, /**< 设置按钮当前的状态就是切换态 */
LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_SELECTED on CLICK, 0: Send LV_EVENT_SELECTED on PRESS 设置按钮的点击方式为松手触发,如果不设置的话,那默认
就是按下时触发,二者只能选择一种*/
};
typedef uint16_t lv_btnmatrix_ctrl_t;
样式
enum {
LV_BTNMATRIX_PART_BG,
LV_BTNMATRIX_PART_BTN,
};
typedef uint8_t lv_btnmatrix_part_t;
例子
lv_obj_t * btnm1;
static const char * btnm1_map[] = { " "LV_SYMBOL_AUDIO"\n#ff0000 AUDIO#", " "LV_SYMBOL_VIDEO"\n#ff0000 VIDEO#", "\n",//换行
" "LV_SYMBOL_HOME"\n#ff0000 HOME#", " "LV_SYMBOL_SAVE"\n#ff0000 SAVE#",
"" };//空字符串作为结束符
static const char * btnm2_map[] = { "Btn1","Btn2","Btn3","" };
static void event_handler(lv_obj_t * obj, lv_event_t event)
{
const char * txt;
uint16_t btn_id;
if(event == LV_EVENT_VALUE_CHANGED) {
//获得当前被点击按钮标题
txt = lv_btnmatrix_get_active_btn_text(obj);
//获得当前被点击按钮id
btn_id = *((uint16_t*)lv_event_get_data());//方式1
//btn_id = lv_btnmatrix_get_active_btn(obj); //方式2
printf("text:%s was pressed id:%d \n", txt, btn_id);
if (strcmp(txt, btnm2_map[0]) == 0)//切换btnm1中id0的禁用控制属性
{
if (lv_btnmatrix_get_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED))
lv_btnmatrix_clear_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED);
else
lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED);
}
if (strcmp(txt, btnm2_map[1]) == 0)//切换btnm1中id0的禁用控制属性
{
if (lv_btnmatrix_get_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN))
lv_btnmatrix_clear_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN);
else
lv_btnmatrix_set_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN);
}
}
}
void lv_ex_btnmatrix_1(void)
{
static lv_style_t style_btnm1_bg;
lv_style_init(&style_btnm1_bg);
/*用这些间距和btnm1对象size间接控制按键大小*/
lv_style_set_pad_top(&style_btnm1_bg, LV_STATE_DEFAULT,5);
lv_style_set_pad_bottom(&style_btnm1_bg, LV_STATE_DEFAULT, 5);
lv_style_set_pad_left(&style_btnm1_bg, LV_STATE_DEFAULT, 15);
lv_style_set_pad_right(&style_btnm1_bg, LV_STATE_DEFAULT, 15);
lv_style_set_pad_inner(&style_btnm1_bg, LV_STATE_DEFAULT, 5);
//lv_style_set_bg_color(&style_btnm1_bg, LV_STATE_DEFAULT, LV_COLOR_PURPLE);
static lv_style_t style_btnm1;
lv_style_init(&style_btnm1);
lv_style_set_radius(&style_btnm1, LV_STATE_DEFAULT, 5);
lv_style_set_bg_color(&style_btnm1, LV_STATE_DEFAULT, LV_COLOR_SILVER);
btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_obj_set_size(btnm1,150,150);
lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
lv_btnmatrix_set_map(btnm1, btnm1_map);//设置映射表
lv_btnmatrix_set_recolor(btnm1, true);//使能重绘色
lv_obj_add_style(btnm1, LV_BTNMATRIX_PART_BG, &style_btnm1_bg);
lv_obj_add_style(btnm1, LV_BTNMATRIX_PART_BTN, &style_btnm1);
lv_obj_set_event_cb(btnm1, event_handler);
//创建btnm2,演示 One Toggle 特性
lv_obj_t * btnm2 = lv_btnmatrix_create(lv_scr_act(), NULL);
lv_obj_set_size(btnm2, 220, 50);
lv_obj_align(btnm2, btnm1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
lv_btnmatrix_set_map(btnm2, btnm2_map);
lv_btnmatrix_set_btn_width(btnm2, 1, 2);//设置Btn2按钮(id=1)的宽度是其他按钮的2倍
lv_btnmatrix_set_btn_ctrl_all(btnm2, LV_BTNMATRIX_CTRL_CHECKABLE);//所有按钮使能toggled
//lv_btnmatrix_set_btn_ctrl(btnm2, 0, LV_BTNMATRIX_CTRL_CHECKABLE);//单个设置
lv_btnmatrix_set_btn_ctrl(btnm2, 2, LV_BTNMATRIX_CTRL_CHECK_STATE);//Btn3默认处于toggled状态
lv_obj_set_event_cb(btnm2, event_handler);
}