需求:通过按钮点击实现加减乘除的简易计算器。
1.我们使用矩阵按钮(lv_btnmatrix)快速创建布局,文本框(lv_textarea)显示结果。
2.在按钮回调中将点击结果加入文本框上显示。
矩阵按钮相对于普通按钮:
•
对于基于网格的按钮布局,按钮矩阵更易于使用。
•
每个按钮矩阵消耗的内存少得多。
lv_obj_t * calc_ta=NULL ;//矩阵按钮对象
double calc_result=0;//计算结果
char textbuf[50];//字符串缓存
static const char * calc_btnm_map[] = {"""\xE6\xB8\x85"/*清*/"""\xE9\x99\xA4"/*除*/"","\n",
"7", "8", "9","/","\n",
"4", "5","6","*","\n",
"1", "2", "3", "-","\n",
".","0","=","+",
""
};//最后一个元素必须为空字符串!
//计算器按钮回调事件
void calc_event_handler(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_CLICKED)
{
const char * txt = lv_btnmatrix_get_active_btn_text(obj);
if(!strcmp(txt,"="))
{
//计算结果显示
sprintf(textbuf,"%s\n",lv_textarea_get_text(calc_ta));//格式字符串
calc_result = EvaluateExpression(textbuf);//将字符串(例如:1+2-3/3)传入计算函数中 返回计算结果
if((calc_result - (int)calc_result) == 0)//无小数则取整数
{
sprintf(textbuf,"%d",(int)calc_result);
}
else
{
sprintf(textbuf,"%lf",calc_result);//calc_result 转换为字符串
}
lv_textarea_set_text(calc_ta,textbuf);//文本框显示计算结果
}
else if(!strcmp(txt,"""\xE6\xB8\x85"/*清*/"""\xE9\x99\xA4"/*除*/""))
{
calc_result=0;
lv_textarea_set_text(calc_ta,"");
}
else
{
lv_textarea_add_text(calc_ta,txt);//将1-9 +-*/ 加入文本框中
}
}
}
//绘制简易计算器UI
void init_ui_calc(lv_obj_t *par)
{
//创建一个容器对象 存放按钮矩阵
lv_obj_t * cont = lv_cont_create(par, NULL);
//设置容器的大小和位置
lv_obj_set_size(cont, 480, 450);
lv_obj_align(cont, NULL, LV_ALIGN_CENTER, 80, 0);
//设置容器的布局为LV_LAYOUT_COLUMN_LEFT
lv_cont_set_layout(cont, LV_LAYOUT_COLUMN_MID);
//文本框 用于显示数据
calc_ta = lv_textarea_create(cont, NULL);
lv_obj_set_size(calc_ta, 470, 50);
lv_textarea_set_text_align(calc_ta, LV_LABEL_ALIGN_LEFT);
lv_textarea_set_text(calc_ta,"");
//按钮矩阵
lv_obj_t * btnm = lv_btnmatrix_create(cont,0);
lv_btnmatrix_set_map(btnm,calc_btnm_map);
lv_obj_set_event_cb(btnm, calc_event_handler);
//lv_obj_set_size(obj,width,height)
lv_obj_set_size(btnm,470,350);
}