| **银杏科技有限公司旗下技术文档发布平台** ||||
|技术支持电话|**0379-69926675-801**|||
|技术支持邮件|Gingko@vip.163.com|||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^
| V1.0 | 2020-12-12 | yang | 初次建立 |
===== 实验十九:lv_cpicker颜色选择器 =====
==== 一、颜色选择器 ====
顾名思义,颜色选择器可以通过点击来选择颜色。可以依次选择颜色的色调、饱和度和值。
颜色选择器具有两种形式:圆环(圆盘)和矩形。在这两种形式中,长按对象,颜色选择器将更改为颜色的下一个参数(色调,饱和度或值)。双击将重置当前参数(默认为红色)。
颜色选择器的主要部分称为 **LV_CPICKER_PART_BG** 。它使用 **scale_width** 设置圆环的宽度,并使用 **pad_inner** 设置圆环和内部预览圆之间的填充距离。在矩形模式下,**radius**(半径)可以用于在矩形上应用半径。
该对象具有称为的虚拟部分 **LV_CPICKER_PART_KNOB** ,它是在当前值上绘制的矩形(或圆形)。它使用所有矩形(如样式属性和填充)使其大于圆环或矩形背景的宽度。
{{ :icore4t:icore4t_rtt_lvgl_19_1.gif?direct |}}
void lv_gui_run(void){
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
lv_obj_t * cpicker = lv_cpicker_create(lv_scr_act(), NULL);/* 创建颜色选择器 */
lv_obj_set_size(cpicker, 200, 200); /* 设置尺寸 */
lv_obj_align(cpicker, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
}
==== 二、类型 ====
可以通过 **lv_cpicker_set_type(cpicker, LV_CPICKER_TYPE_RECT/DISC)** 更改颜色选择器的类型,默认类型为圆环 **LV_CPICKER_TYPE_DISC** 。
{{ :icore4t:icore4t_rtt_lvgl_19_2.gif?direct |}}
void lv_gui_run(void){
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
lv_obj_t * cpicker = lv_cpicker_create(lv_scr_act(), NULL);/* 创建颜色选择器 */
lv_cpicker_set_type(cpicker, LV_CPICKER_TYPE_RECT); /* 设置类型为矩形 */
lv_obj_set_size(cpicker, 200, 50); /* 设置尺寸 */
lv_obj_align(cpicker, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
}
==== 三、设置颜色 ====
使用一下方法,用户可以手动设置颜色选择器的色调、饱和度、值。
* **lv_cpicker_set_hue/saturation/value(cpicker, x)** 设置色调。
* **lv_cpicker_set_hsv(cpicker, hsv)** 设置饱和度。
* **lv_cpicker_set_color(cpicker, rgb)** 设置颜色值。
==== 四、颜色模式 ====
默认情况下长按控件可以更改当前颜色模式,不过,用户也可以使用函数 **lv_cpicker_set_color_mode(cpicker,,LV_CPICKER_COLOR_MODE_HUE/ SATURATION/ VALUE)** 选择当前的色彩模式。
若不想改变颜色模式,可以使用方法 **lv_cpicker_set_color_mode_fixed(cpicker, true)** 来固定颜色模式。
==== 五、旋钮颜色 ====
若使能 **lv_cpicker_set_knob_colored(cpicker, true)** ,则旋钮背景色将自动更新为颜色选择器所选颜色。
==== 六、事件 ====
颜色选择器仅支持通用事件,键值如下:
* **LV_KEY_UP,LV_KEY_RIGHT** 将当前参数的值增加 1。
* **LV_KEY_DOWN,LV_KEY_LEFT** 将当前参数减 1。
* **LV_KEY_ENTER** 长按将显示下一个模式。
通过双击可以重置当前参数。
{{ :icore4t:icore4t_rtt_lvgl_19_3.gif?direct |}}
lv_obj_t * labelr; /* 定义标签 */
lv_obj_t * labelg;
lv_obj_t * labelb;
lv_obj_t * labeltxt;
lv_obj_t * cpicker; /* 定义颜色选择器 */
unsigned char r,g,b,temp; /* 定义变量 */
static void event_handler(lv_obj_t * obj, lv_event_t event) { /* 回调函数 */
if(event == LV_EVENT_VALUE_CHANGED) { /* 按键状态切换的话 */
lv_color_t color = lv_cpicker_get_color(cpicker);/* 获取当前选择的颜色 */
temp = color.ch.red & 0x07; /* RGB565转RGB888 */
r = color.ch.red << 3 | temp;
temp = color.ch.green & 0x03;
g = color.ch.green << 2 | temp;
temp = color.ch.blue & 0x07;
b = color.ch.blue << 3 | temp;
lv_label_set_text_fmt(labelr, "red: %d",r); /* 更新标签内容 */
lv_label_set_text_fmt(labelg, "green: %d",g);
lv_label_set_text_fmt(labelb, "blue: %d",b); /* 更新labeltxt标签字体颜色 */
if(r == 0)lv_label_set_text_fmt(labeltxt, "#0%x%x%x color#",r,g,b);
else if(g == 0)lv_label_set_text_fmt(labeltxt, "#%x0%x%x color#",r,g,b);
else lv_label_set_text_fmt(labeltxt, "#%x%x%x0 color#",r,g,b);
} }
void lv_gui_run(void){
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
cpicker = lv_cpicker_create(lv_scr_act(), NULL); /* 创建颜色选择器 */
lv_obj_set_size(cpicker, 100, 100); /* 设置尺寸 */
lv_obj_align(cpicker, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */
lv_cpicker_set_type(cpicker, LV_CPICKER_TYPE_DISC); /* 设为圆形 */
lv_obj_set_event_cb(cpicker, event_handler); /* 绑定回调函数 */
labelr = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
lv_label_set_text(labelr, "red: 255"); /* 设置标签默认内容 */
lv_obj_align(labelr, NULL, LV_ALIGN_IN_RIGHT_MID, -70, -30); /* 设置位置 */
labelg = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
lv_label_set_text(labelg, "green: 0"); /* 设置标签默认内容 */
lv_obj_align(labelg, NULL, LV_ALIGN_IN_RIGHT_MID, -70, 0); /* 设置位置 */
labelb = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
lv_label_set_text(labelb, "blue: 0"); /* 设置标签默认内容 */
lv_obj_align(labelb, NULL, LV_ALIGN_IN_RIGHT_MID, -70, 30); /* 设置位置 */
labeltxt = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
lv_label_set_recolor(labeltxt, true); /* 重着色使能 */
lv_label_set_text(labeltxt, "#ff0000 color#"); /* 设置标签默认内容 */
lv_obj_align(labeltxt, cpicker, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); /* 设置位置 */
}