基础对象 (lv_obj)

概述

“基础对象”实现了屏幕上小部件的基本属性,例如:

  • 坐标

  • 父对象

  • 子对象

  • 包含样式

  • 属性如可点击可滚动等。

在面向对象的思维中,它是 LVGL 中所有其他对象继承的基类。

基础对象的功能和特性也可以用于其他小部件。例如 lv_obj_set_width(slider, 100)

基础对象可以直接用作简单的小部件:它仅仅是一个矩形。用 HTML 的术语来说,可以将其视为一个 <div>

坐标

这里只描述了一小部分坐标设置。要查看 LVGL 的所有功能(填充、样式中的坐标、布局等),请访问坐标页面。

大小

可以使用 lv_obj_set_width(obj, new_width)lv_obj_set_height(obj, new_height) 分别修改对象的宽度和高度,或者使用 lv_obj_set_size(obj, new_width, new_height) 同时修改两个轴的大小。

位置

可以使用 lv_obj_set_x(obj, new_x)lv_obj_set_y(obj, new_y) 设置相对于父对象的位置,或者使用 lv_obj_set_pos(obj, new_x, new_y) 同时设置两个轴的位置。

对齐

可以使用 lv_obj_set_align(obj, LV_ALIGN_...) 在父对象上对齐对象。之后,每个 x 和 y 设置都将相对于设置的对齐模式。 例如,这将对象从父对象的中心偏移 10;20 像素:

lv_obj_set_align(obj, LV_ALIGN_CENTER);
lv_obj_set_pos(obj, 10, 20);

// 或者使用一个函数
lv_obj_align(obj, LV_ALIGN_CENTER, 10, 20);

要将一个对象对齐到另一个对象,请使用:lv_obj_align_to(obj_to_align, obj_reference, LV_ALIGN_..., x, y)

例如,将文本对齐到图像下方:lv_obj_align_to(text, image, LV_ALIGN_OUT_BOTTOM_MID, 0, 10)

以下是存在的对齐类型: ../_images/align.png

父对象和子对象

可以使用 lv_obj_set_parent(obj, new_parent) 为对象设置一个新的父对象。要获取当前父对象,请使用 lv_obj_get_parent(obj)

要获取父对象的特定子对象,请使用 lv_obj_get_child(parent, idx)。以下是 idx 的一些示例:

  • 0 获取第一个创建的子对象

  • 1 获取第二个创建的子对象

  • -1 获取最后创建的子对象

可以像这样迭代子对象:

uint32_t i;
for(i = 0; i < lv_obj_get_child_cnt(parent); i++) {
  lv_obj_t * child = lv_obj_get_child(parent, i);
  /*对子对象执行操作*/
}

lv_obj_get_index(obj) 返回对象在其父对象中的索引。它等同于父对象中较年轻子对象的数量。

可以使用 lv_obj_move_foreground(obj)lv_obj_move_background(obj) 将对象移到前景或发送到背景。

可以使用 lv_obj_move_to_index(obj, index) 更改对象在其父对象中的索引。

可以使用 lv_obj_swap(obj1, obj2) 交换两个对象的位置。

显示和屏幕

在 LVGL 对象层次结构的最高级别是显示,它表示显示设备(物理显示或模拟器)的驱动程序。一个显示可以有一个或多个与之关联的屏幕。每个屏幕包含一个对象层次结构,用于表示覆盖整个显示的布局的图形小部件。

当您创建了一个屏幕,例如 lv_obj_t * screen = lv_obj_create(NULL),可以使用 lv_scr_load(screen) 将其设置为活动屏幕。lv_scr_act() 函数为您提供指向活动屏幕的指针。

如果您有多个显示器,重要的是要知道屏幕功能操作的是最近创建的显示器或通过 lv_disp_set_default 显式选择的显示器。

要获取对象的屏幕,请使用 lv_obj_get_screen(obj) 函数。

事件

要为对象设置事件回调,请使用 lv_obj_add_event_cb(obj, event_cb, LV_EVENT_..., user_data)

要手动向对象发送事件,请使用 lv_event_send(obj, LV_EVENT_..., param)

阅读事件概述以了解更多关于事件的信息。

样式

请务必阅读样式概述。这里只描述了最基本的功能。

可以使用 lv_obj_add_style(obj, &new_style, selector) 函数将新样式添加到对象。 selector 是部分和状态的 OR 组合。例如 LV_PART_SCROLLBAR | LV_STATE_PRESSED

基础对象使用 LV_PART_MAIN 样式属性和 LV_PART_SCROLLBAR,具有典型的背景样式属性。

标志

可以通过 lv_obj_add/clear_flag(obj, LV_OBJ_FLAG_...) 启用/禁用某些属性:

  • LV_OBJ_FLAG_HIDDEN 使对象隐藏。(就像它根本不存在一样)

  • LV_OBJ_FLAG_CLICKABLE 使对象可被输入设备点击

  • LV_OBJ_FLAG_CLICK_FOCUSABLE 点击时为对象添加焦点状态

  • LV_OBJ_FLAG_CHECKABLE 点击对象时切换选中状态

  • LV_OBJ_FLAG_SCROLLABLE 使对象可滚动

  • LV_OBJ_FLAG_SCROLL_ELASTIC 允许在内部滚动但速度较慢

  • LV_OBJ_FLAG_SCROLL_MOMENTUM 使对象在“抛出”时滚动更远

  • LV_OBJ_FLAG_SCROLL_ONE 仅允许滚动一个可捕捉的子对象

  • LV_OBJ_FLAG_SCROLL_CHAIN_HOR 允许将水平滚动传播到父对象

  • LV_OBJ_FLAG_SCROLL_CHAIN_VER 允许将垂直滚动传播到父对象

  • LV_OBJ_FLAG_SCROLL_CHAIN 简单包装(LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER

  • LV_OBJ_FLAG_SCROLL_ON_FOCUS 在聚焦时自动滚动对象以使其可见

  • LV_OBJ_FLAG_SCROLL_WITH_ARROW 允许使用箭头键滚动聚焦对象

  • LV_OBJ_FLAG_SNAPPABLE 如果父对象启用了滚动捕捉,则可以捕捉到此对象

  • LV_OBJ_FLAG_PRESS_LOCK 即使按压滑出对象,也保持对象按压状态

  • LV_OBJ_FLAG_EVENT_BUBBLE 将事件传播到父对象

  • LV_OBJ_FLAG_GESTURE_BUBBLE 将手势传播到父对象

  • LV_OBJ_FLAG_ADV_HITTEST 允许执行更精确的命中(点击)测试。例如,考虑到圆角

  • LV_OBJ_FLAG_IGNORE_LAYOUT 使对象可由布局定位

  • LV_OBJ_FLAG_FLOATING 当父对象滚动时不滚动对象并忽略布局

  • LV_OBJ_FLAG_OVERFLOW_VISIBLE 不将子对象的内容裁剪到父对象的边界

  • LV_OBJ_FLAG_LAYOUT_1 自定义标志,可由布局自由使用

  • LV_OBJ_FLAG_LAYOUT_2 自定义标志,可由布局自由使用

  • LV_OBJ_FLAG_WIDGET_1 自定义标志,可由小部件自由使用

  • LV_OBJ_FLAG_WIDGET_2 自定义标志,可由小部件自由使用

  • LV_OBJ_FLAG_USER_1 自定义标志,可由用户自由使用

  • LV_OBJ_FLAG_USER_2 自定义标志,可由用户自由使用

  • LV_OBJ_FLAG_USER_3 自定义标志,可由用户自由使用

  • LV_OBJ_FLAG_USER_4 自定义标志,可由用户自由使用

一些示例:

/*隐藏对象*/
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);

/*使对象不可点击*/
lv_obj_clear_flag(obj, LV_OBJ_FLAG_CLICKABLE);

阅读输入设备概述以了解更多关于的信息。

可以使用 lv_group_add_obj(group, obj) 将对象添加到,并可以使用 lv_obj_get_group(obj) 查看对象属于哪个组。

lv_obj_is_focused(obj) 返回对象当前是否在其组中聚焦。如果对象未添加到组中,将返回 false

扩展点击区域

默认情况下,仅在对象的边界区域内可以点击对象。然而,可以使用 lv_obj_set_ext_click_area(obj, size) 扩展点击区域。

事件

  • LV_EVENT_VALUE_CHANGED 当启用 LV_OBJ_FLAG_CHECKABLE 标志并点击对象时(在选中状态之间切换时)

  • LV_EVENT_DRAW_PART_BEGINLV_EVENT_DRAW_PART_END 会为以下类型发送:

    • LV_OBJ_DRAW_PART_RECTANGLE 主矩形

      • part: LV_PART_MAIN

      • rect_dsc

      • draw_area: 矩形的区域

    • LV_OBJ_DRAW_PART_BORDER_POST 如果 border_post 样式属性为 true,则绘制边框

      • part: LV_PART_MAIN

      • rect_dsc

      • draw_area: 矩形的区域

    • LV_OBJ_DRAW_PART_SCROLLBAR 滚动条

      • part: LV_PART_SCROLLBAR

      • rect_dsc

      • draw_area: 矩形的区域

了解更多关于事件的信息。

按键

如果启用了 LV_OBJ_FLAG_CHECKABLELV_KEY_RIGHTLV_KEY_UP 使对象选中,LV_KEY_LEFTLV_KEY_DOWN 使对象未选中。

如果启用了 LV_OBJ_FLAG_SCROLLABLE,但对象不可编辑(由小部件类声明),箭头键(LV_KEY_UPLV_KEY_DOWNLV_KEY_LEFTLV_KEY_RIGHT)滚动对象。如果对象只能垂直滚动,LV_KEY_LEFTLV_KEY_RIGHT 将向上/向下滚动,从而使其与编码器输入设备兼容。有关编码器行为和编辑模式的更多信息,请参阅输入设备概述

了解更多关于按键的信息。

示例

Base objects with custom styles

C code  

 GitHub
#include "../../lv_examples.h"
#if LV_BUILD_EXAMPLES

void lv_example_obj_1(void)
{
    lv_obj_t * obj1;
    obj1 = lv_obj_create(lv_scr_act());
    lv_obj_set_size(obj1, 100, 50);
    lv_obj_align(obj1, LV_ALIGN_CENTER, -60, -30);

    static lv_style_t style_shadow;
    lv_style_init(&style_shadow);
    lv_style_set_shadow_width(&style_shadow, 10);
    lv_style_set_shadow_spread(&style_shadow, 5);
    lv_style_set_shadow_color(&style_shadow, lv_palette_main(LV_PALETTE_BLUE));

    lv_obj_t * obj2;
    obj2 = lv_obj_create(lv_scr_act());
    lv_obj_add_style(obj2, &style_shadow, 0);
    lv_obj_align(obj2, LV_ALIGN_CENTER, 60, 30);
}
#endif

MicroPython code  

 GitHub Simulator
obj1 = lv.obj(lv.scr_act())
obj1.set_size(100, 50)
obj1.align(lv.ALIGN.CENTER, -60, -30)

style_shadow = lv.style_t()
style_shadow.init()
style_shadow.set_shadow_width(10)
style_shadow.set_shadow_spread(5)
style_shadow.set_shadow_color(lv.palette_main(lv.PALETTE.BLUE))

obj2 = lv.obj(lv.scr_act())
obj2.add_style(style_shadow, 0)
obj2.align(lv.ALIGN.CENTER, 60, 30)


Make an object draggable

C code  

 GitHub
#include "../../lv_examples.h"
#if LV_BUILD_EXAMPLES

static void drag_event_handler(lv_event_t * e)
{
    lv_obj_t * obj = lv_event_get_target(e);

    lv_indev_t * indev = lv_indev_get_act();
    if(indev == NULL)  return;

    lv_point_t vect;
    lv_indev_get_vect(indev, &vect);

    lv_coord_t x = lv_obj_get_x(obj) + vect.x;
    lv_coord_t y = lv_obj_get_y(obj) + vect.y;
    lv_obj_set_pos(obj, x, y);
}


/**
 * Make an object dragable.
 */
void lv_example_obj_2(void)
{
    lv_obj_t * obj;
    obj = lv_obj_create(lv_scr_act());
    lv_obj_set_size(obj, 150, 100);
    lv_obj_add_event_cb(obj, drag_event_handler, LV_EVENT_PRESSING, NULL);

    lv_obj_t * label = lv_label_create(obj);
    lv_label_set_text(label, "Drag me");
    lv_obj_center(label);

}
#endif

MicroPython code  

 GitHub Simulator
def drag_event_handler(e):

    obj = e.get_target()

    indev = lv.indev_get_act()

    vect = lv.point_t()
    indev.get_vect(vect)
    x = obj.get_x() + vect.x
    y = obj.get_y() + vect.y
    obj.set_pos(x, y)


#
# Make an object dragable.
#

obj = lv.obj(lv.scr_act())
obj.set_size(150, 100)
obj.add_event_cb(drag_event_handler, lv.EVENT.PRESSING, None)

label = lv.label(obj)
label.set_text("Drag me")
label.center()


API

Typedefs

typedef uint16_t lv_state_t
typedef uint32_t lv_part_t
typedef uint32_t lv_obj_flag_t
typedef struct _lv_obj_t lv_obj_t

Enums

Possible states of a widget. OR-ed values are possible

Values:

enumerator LV_STATE_DEFAULT
enumerator LV_STATE_CHECKED
enumerator LV_STATE_FOCUSED
enumerator LV_STATE_FOCUS_KEY
enumerator LV_STATE_EDITED
enumerator LV_STATE_HOVERED
enumerator LV_STATE_PRESSED
enumerator LV_STATE_SCROLLED
enumerator LV_STATE_DISABLED
enumerator LV_STATE_USER_1
enumerator LV_STATE_USER_2
enumerator LV_STATE_USER_3
enumerator LV_STATE_USER_4
enumerator LV_STATE_ANY

Special value can be used in some functions to target all states

The possible parts of widgets. The parts can be considered as the internal building block of the widgets. E.g. slider = background + indicator + knob Not all parts are used by every widget

Values:

enumerator LV_PART_MAIN

A background like rectangle

enumerator LV_PART_SCROLLBAR

The scrollbar(s)

enumerator LV_PART_INDICATOR

Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox

enumerator LV_PART_KNOB

Like handle to grab to adjust the value

enumerator LV_PART_SELECTED

Indicate the currently selected option or section

enumerator LV_PART_ITEMS

Used if the widget has multiple similar elements (e.g. table cells)

enumerator LV_PART_TICKS

Ticks on scale e.g. for a chart or meter

enumerator LV_PART_CURSOR

Mark a specific place e.g. for text area's cursor or on a chart

enumerator LV_PART_CUSTOM_FIRST

Extension point for custom widgets

enumerator LV_PART_ANY

Special value can be used in some functions to target all parts

On/Off features controlling the object's behavior. OR-ed values are possible

Values:

enumerator LV_OBJ_FLAG_HIDDEN

Make the object hidden. (Like it wasn't there at all)

enumerator LV_OBJ_FLAG_CLICKABLE

Make the object clickable by the input devices

enumerator LV_OBJ_FLAG_CLICK_FOCUSABLE

Add focused state to the object when clicked

enumerator LV_OBJ_FLAG_CHECKABLE

Toggle checked state when the object is clicked

enumerator LV_OBJ_FLAG_SCROLLABLE

Make the object scrollable

enumerator LV_OBJ_FLAG_SCROLL_ELASTIC

Allow scrolling inside but with slower speed

enumerator LV_OBJ_FLAG_SCROLL_MOMENTUM

Make the object scroll further when "thrown"

enumerator LV_OBJ_FLAG_SCROLL_ONE

Allow scrolling only one snappable children

enumerator LV_OBJ_FLAG_SCROLL_CHAIN_HOR

Allow propagating the horizontal scroll to a parent

enumerator LV_OBJ_FLAG_SCROLL_CHAIN_VER

Allow propagating the vertical scroll to a parent

enumerator LV_OBJ_FLAG_SCROLL_CHAIN
enumerator LV_OBJ_FLAG_SCROLL_ON_FOCUS

Automatically scroll object to make it visible when focused

enumerator LV_OBJ_FLAG_SCROLL_WITH_ARROW

Allow scrolling the focused object with arrow keys

enumerator LV_OBJ_FLAG_SNAPPABLE

If scroll snap is enabled on the parent it can snap to this object

enumerator LV_OBJ_FLAG_PRESS_LOCK

Keep the object pressed even if the press slid from the object

enumerator LV_OBJ_FLAG_EVENT_BUBBLE

Propagate the events to the parent too

enumerator LV_OBJ_FLAG_GESTURE_BUBBLE

Propagate the gestures to the parent

enumerator LV_OBJ_FLAG_ADV_HITTEST

Allow performing more accurate hit (click) test. E.g. consider rounded corners.

enumerator LV_OBJ_FLAG_IGNORE_LAYOUT

Make the object position-able by the layouts

enumerator LV_OBJ_FLAG_FLOATING

Do not scroll the object when the parent scrolls and ignore layout

enumerator LV_OBJ_FLAG_OVERFLOW_VISIBLE

Do not clip the children's content to the parent's boundary

enumerator LV_OBJ_FLAG_LAYOUT_1

Custom flag, free to use by layouts

enumerator LV_OBJ_FLAG_LAYOUT_2

Custom flag, free to use by layouts

enumerator LV_OBJ_FLAG_WIDGET_1

Custom flag, free to use by widget

enumerator LV_OBJ_FLAG_WIDGET_2

Custom flag, free to use by widget

enumerator LV_OBJ_FLAG_USER_1

Custom flag, free to use by user

enumerator LV_OBJ_FLAG_USER_2

Custom flag, free to use by user

enumerator LV_OBJ_FLAG_USER_3

Custom flag, free to use by user

enumerator LV_OBJ_FLAG_USER_4

Custom flag, free to use by user

enum lv_obj_draw_part_type_t

type field in lv_obj_draw_part_dsc_t if class_p = lv_obj_class Used in LV_EVENT_DRAW_PART_BEGIN and LV_EVENT_DRAW_PART_END

Values:

enumerator LV_OBJ_DRAW_PART_RECTANGLE

The main rectangle

enumerator LV_OBJ_DRAW_PART_BORDER_POST

The border if style_border_post = true

enumerator LV_OBJ_DRAW_PART_SCROLLBAR

The scrollbar

Functions

void lv_init(void)

Initialize LVGL library. Should be called before any other LVGL related function.

void lv_deinit(void)

Deinit the 'lv' library Currently only implemented when not using custom allocators, or GC is enabled.

bool lv_is_initialized(void)

Returns whether the 'lv' library is currently initialized

lv_obj_t *lv_obj_create(lv_obj_t *parent)

Create a base object (a rectangle)

Parameters

parent -- pointer to a parent object. If NULL then a screen will be created.

Returns

pointer to the new object

void lv_obj_add_flag(lv_obj_t *obj, lv_obj_flag_t f)

Set one or more flags

Parameters
  • obj -- pointer to an object

  • f -- R-ed values from lv_obj_flag_t to set.

void lv_obj_clear_flag(lv_obj_t *obj, lv_obj_flag_t f)

Clear one or more flags

Parameters
  • obj -- pointer to an object

  • f -- OR-ed values from lv_obj_flag_t to set.

void lv_obj_add_state(lv_obj_t *obj, lv_state_t state)

Add one or more states to the object. The other state bits will remain unchanged. If specified in the styles, transition animation will be started from the previous state to the current.

Parameters
  • obj -- pointer to an object

  • state -- the states to add. E.g LV_STATE_PRESSED | LV_STATE_FOCUSED

void lv_obj_clear_state(lv_obj_t *obj, lv_state_t state)

Remove one or more states to the object. The other state bits will remain unchanged. If specified in the styles, transition animation will be started from the previous state to the current.

Parameters
  • obj -- pointer to an object

  • state -- the states to add. E.g LV_STATE_PRESSED | LV_STATE_FOCUSED

static inline void lv_obj_set_user_data(lv_obj_t *obj, void *user_data)

Set the user_data field of the object

Parameters
  • obj -- pointer to an object

  • user_data -- pointer to the new user_data.

bool lv_obj_has_flag(const lv_obj_t *obj, lv_obj_flag_t f)

Check if a given flag or all the given flags are set on an object.

Parameters
  • obj -- pointer to an object

  • f -- the flag(s) to check (OR-ed values can be used)

Returns

true: all flags are set; false: not all flags are set

bool lv_obj_has_flag_any(const lv_obj_t *obj, lv_obj_flag_t f)

Check if a given flag or any of the flags are set on an object.

Parameters
  • obj -- pointer to an object

  • f -- the flag(s) to check (OR-ed values can be used)

Returns

true: at lest one flag flag is set; false: none of the flags are set

lv_state_t lv_obj_get_state(const lv_obj_t *obj)

Get the state of an object

Parameters

obj -- pointer to an object

Returns

the state (OR-ed values from lv_state_t)

bool lv_obj_has_state(const lv_obj_t *obj, lv_state_t state)

Check if the object is in a given state or not.

Parameters
  • obj -- pointer to an object

  • state -- a state or combination of states to check

Returns

true: obj is in state; false: obj is not in state

void *lv_obj_get_group(const lv_obj_t *obj)

Get the group of the object

Parameters

obj -- pointer to an object

Returns

the pointer to group of the object

static inline void *lv_obj_get_user_data(lv_obj_t *obj)

Get the user_data field of the object

Parameters

obj -- pointer to an object

Returns

the pointer to the user_data of the object

void lv_obj_allocate_spec_attr(lv_obj_t *obj)

Allocate special data for an object if not allocated yet.

Parameters

obj -- pointer to an object

bool lv_obj_check_type(const lv_obj_t *obj, const lv_obj_class_t *class_p)

Check the type of obj.

Parameters
  • obj -- pointer to an object

  • class_p -- a class to check (e.g. lv_slider_class)

Returns

true: class_p is the obj class.

bool lv_obj_has_class(const lv_obj_t *obj, const lv_obj_class_t *class_p)

Check if any object has a given class (type). It checks the ancestor classes too.

Parameters
  • obj -- pointer to an object

  • class_p -- a class to check (e.g. lv_slider_class)

Returns

true: obj has the given class

const lv_obj_class_t *lv_obj_get_class(const lv_obj_t *obj)

Get the class (type) of the object

Parameters

obj -- pointer to an object

Returns

the class (type) of the object

bool lv_obj_is_valid(const lv_obj_t *obj)

Check if any object is still "alive".

Parameters

obj -- pointer to an object

Returns

true: valid

static inline lv_coord_t lv_obj_dpx(const lv_obj_t *obj, lv_coord_t n)

Scale the given number of pixels (a distance or size) relative to a 160 DPI display considering the DPI of the obj's display. It ensures that e.g. lv_dpx(100) will have the same physical size regardless to the DPI of the display.

Parameters
  • obj -- an object whose display's dpi should be considered

  • n -- the number of pixels to scale

Returns

n x current_dpi/160

Variables

const lv_obj_class_t lv_obj_class

Make the base object's class publicly available.

struct _lv_obj_spec_attr_t
#include <lv_obj.h>

Special, rarely used attributes. They are allocated automatically if any elements is set.

Public Members

struct _lv_obj_t **children

Store the pointer of the children in an array.

uint32_t child_cnt

Number of children

lv_group_t *group_p
struct _lv_event_dsc_t *event_dsc

Dynamically allocated event callback and user data array

lv_point_t scroll

The current X/Y scroll offset

lv_coord_t ext_click_pad

Extra click padding in all direction

lv_coord_t ext_draw_size

EXTend the size in every direction for drawing.

lv_scrollbar_mode_t scrollbar_mode

How to display scrollbars

lv_scroll_snap_t scroll_snap_x

Where to align the snappable children horizontally

lv_scroll_snap_t scroll_snap_y

Where to align the snappable children vertically

lv_dir_t scroll_dir

The allowed scroll direction(s)

uint8_t event_dsc_cnt

Number of event callbacks stored in event_dsc array

uint8_t layer_type

Cache the layer type here. Element of @lv_intermediate_layer_type_t

struct _lv_obj_t

Public Members

const lv_obj_class_t *class_p
struct _lv_obj_t *parent
_lv_obj_spec_attr_t *spec_attr
_lv_obj_style_t *styles
void *user_data
lv_area_t coords
lv_obj_flag_t flags
lv_state_t state
uint16_t layout_inv
uint16_t scr_layout_inv
uint16_t skip_trans
uint16_t style_cnt
uint16_t h_layout
uint16_t w_layout