LVGL官方文档-7.11.0-9-Overview-Objects

在LVGL中,用户界面的基本组成元素是objects,也称为widegts,如Button, Label,Image,List,Chart和Text area。
Attributes
Basic attributes
所有的Object都拥有一些基本属性:
- Position
- Size
- Parent
- Drag enable
- Click enable等等
可以通过lv_obj_set_…和lv_obj_get_…来设置或者获取这些属性:
/*Set basic object attributes*/
lv_obj_set_size(btn1, 100, 50); /*Button size*/
Specific attributes
不同类型的Object也有各自的属性,例如,Slider拥有如下特殊的属性:
- 最大值、最小值
- 当前值
- Style
对于这些属性,Object有特殊接口。拿Slider举例来说:
/*Set slider specific attributes*/
lv_slider_set_range(slider1, 0, 100); /*Set min. and max. values*/
lv_slider_set_value(slider1, 40, LV_ANIM_ON); /*Set the current value (p
这些特定Object特有的属性接口在相关object的文档中有详细描述。也可以直接查看相关Object的头文件。(例如lv_objx/lv_slider.h)
Working mechanisms
Parent-child structure
父Object可以看成是其子objects的容器。每个Object都有一个明确的父Object(screen除外),但是一个父Object可以有无限多个子Object。对于父Object,没有类型的限制,但是有一些像Button和Label这样很典型的父子关系。
Moving togethre
如果父Object的位置移动了,子object也随之移动。因此,所有的位置关系都是相对于其父Object的。
(0;0)这样的坐标意味着不管父Object在哪里,子Object始终位于父Object的左上角。
lv_obj_t * par = lv_obj_create(lv_scr_act(), NULL); /*Create a parent object on the current screen*/
lv_obj_set_size(par, 100, 80); /*Set the size of the parent*/
lv_obj_t * obj1 = lv_obj_create(par, NULL); /*Create an object on the previously created parent object*/
lv_obj_set_pos(obj1, 10, 10); /*Set the position of the new object*/
改变父Object的位置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fV8AHRG-1626687493758)(https://docs.lvgl.io/7.11/_images/par_child2.png)]
lv_obj_set_pos(par, 50, 50); /*Move the parent. The child will move with it.*/
(简单起见,上述代码中省去了设置Object的颜色)
Visiblility only on the parent
如果子Object部分或者全部超出了其父Object的范围,那么这部分就不可见了。
lv_obj_set_x(obj1, -30); /*Move the child a little bit of the parent*/
Create-delete objects
LVGL的Object可以在运行时动态创建和删除。这意味着只有当前创建的Object会消耗内存。例如,如果你要一个Chart,那么就在需要的时候创建,当它不可见的时候删除。
每种的Object都有其独特的创建函数,但是这些创建函数有统一的原型。它需要两个参数:
- 一个指向父Object的指针。创建screen的时候,传入NULL作为父Object。
- 可选的,一个指向同类型的待复制的object的指针。不用复制的时候这个参数可以传入NULL。
所有的Object都是用一个lv_obj_t类型的指针最为句柄。这个指针稍后可用于设置或者获取Object的属性。
创建的函数形如:
lv_obj_t *lv_<type>_create(lv_obj_t *parent, lv_obj_t *copy);
所有的Object类型都有统一的删除函数,这会删除Object及其所有的子Object。
void lv_obj_del(lv_obj_t *obj);
lv_obj_del会自动删除对象。如果出于某些原因,不能立即删除对象,可以使用lv_obj_del_async(obj)函数。例如,在子Object的IV_EVENT_DELETE事件里面删除父Object。
可以用lv_obj_clean函数删除一个object的所有子Object,而不删除这个Object本身。
void lv_obj_clean(lv_obj_t *obj);
Screens
Create screens
Screen是没有父Object的特殊Object。所以,它们可以这样创建:
lv_obj_t *scr1 = lv_obj_create(NULL, NULL);
Screen可以用任何类型来创建,如Base Object,或者用Image作为墙纸。
Get the active screen
每个Display上总有一个活跃的Screen。默认情况下,LVGL为每个Display创建并载入一个Basic Object作为Screen。
用lv_scr_act()函数来获取当前活跃的Screen。
Load screens
用lv_scr_load(scr1)来载入新的Screen。
Load screen with animation
也可以用lv_scr_load_anim(scr, transition_type, time, delay, auto_del)在载入时增加动画。transiition_type有如下几种:
- LV_SCR_LOAD_ANIM_NONE:在delay毫秒后立即切换
- LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM:新Screen向指定方向覆盖老Screen
- LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM:新Screen和老Scree都向指定的方向移动
- LV_SCR_LOAD_ANIM_FADE_ON:淡入
如果向auto_del传true,当动画结束,老的Screen会被自动删除。
当动画在延迟了delay毫秒开始播放的时候,新Screen会成为活跃的Screen。这个时候,用lv_scr_act()就会返回新的Screen。
Handling multiple display
Screen在当前选择的默认的Display上创建。默认的Display是用lv_disp_drv_register()注册的最后一个display,也可以用lv_disp_set_default(disp)来设置默认Display。
lv_scr_act(),lv_scr_load()和lv_scr_load_anim()都是在默认Display上操作。
详见Multi-display support这一章节。
Parts
Widget由一个或多个Part组成。例如,Button只有一个main part,而Slider有background, indicator和knob。
Part的名称形如LV_PART。例如LV_BTN_PART_MAIN和LV_SLIDER_PART_KNOB。通常当Style添加到Object的时候,Part会被用到。通过使用Part,可以对Object的不同部分使用不通的Style。
获取关于Part的更多详细信息,请查看Style overview章节。
States
Object可以处于下列状态的组合状态下。
- LV_STATE_DEFAULT
- LV_STATE_CHECKED
- LV_STATE_FOCUSED
- LV_STATE_EDITED
- LV_STATE_HOVERED
- LV_STATE_PRESSED
- LV_STATE_DISABLED
当用户对一个Object按压、释放、更改焦点的时候,LVGL会自动更改其State。然而,State也可以手动改变。用lv_obj_set_state(obj, part, LV_STATE_…)来完全改变一个Object的状态。用lv_obj_add/clear_state(obj, part, LV_STATE_…)来设置或者清除某一特定状态。这两种使用方法中,State值都可以用“或”运算组合。
获取更多State信息,请查看Style overview章节。




更多推荐
所有评论(0)