LittleVGL--07lv_obj基础对象介绍、API 接口、例程演示

lv_obj基础对象介绍

在这里插入图片描述

API 接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
演示代码如下:

#include "test.h"
#include <stdio.h>

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    lv_obj_t* scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    lv_obj_t* obj1 = lv_obj_create(scr,NULL);

}

运行代码如下:
在这里插入图片描述
这个就是默认的对象,有默认的颜色和大小。

在这里插入图片描述
演示代码如下:(当点击按钮后,默认对象被删除。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_del(obj1);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    lv_obj_t* scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

运行效果如下:
在这里插入图片描述
在这里插入图片描述
将上面代码中的 btn1_event_cb 中的 lv_obj_del 换成 lv_obj_del_async ,演示效果是一样的。
在这里插入图片描述
演示代码如下:(当点击按钮后,清空所有 obj1 下的所有子对象。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_style_t style1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_clean(obj1);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    lv_obj_t* scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(obj1,50,50);

    //创建一个默认对象
    lv_obj_t* child1 = lv_obj_create(obj1,NULL);
    //设置大小
    lv_obj_set_size(child1,20,20);

    //定义 lv_style_t 这种变量时要定义成静态局部变量或者定义为全局变量。
    //static lv_style_t sty1;

    //因为一个样式中的属性有很多
    //所以这里为了避免麻烦,先从一个现成的样式中进行拷贝
    //lv_style_plain_color是 LittleVGL 中自带的
    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;
    lv_obj_set_style(child1,&style1);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

运行效果如下:
在这里插入图片描述
子对象的坐标原点是以父对象的原点为参考点的,如下图所示。obj1 的父对象是窗体,因此,当设定 obj1 的坐标为(50,50)是以父对象的原点为参考点的。而 child1 的父对象又是 obj1,所以尽管没有设置 child1 的坐标位置,它还是显示在了 (50,50)的位置。
在这里插入图片描述
2.2.6 用到的地方不多,不讲。
在这里插入图片描述
演示代码如下:(当点击按钮后,将 child1 的父对象从 obj1 变为 child1。注意位置的变化)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_style_t style1;

lv_obj_t* scr;

lv_obj_t* child1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_parent(child1,scr);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(obj1,50,50);

    //创建一个默认对象
    child1 = lv_obj_create(obj1,NULL);
    //设置大小
    lv_obj_set_size(child1,20,20);

    //定义 lv_style_t 这种变量时要定义成静态局部变量或者定义为全局变量。
    //static lv_style_t sty1;

    //因为一个样式中的属性有很多
    //所以这里为了避免麻烦,先从一个现成的样式中进行拷贝
    //lv_style_plain_color是 LittleVGL 中自带的
    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;
    lv_obj_set_style(child1,&style1);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

运行效果如下:
在这里插入图片描述
在这里插入图片描述
演示代码如下:(初始时 obj1 位于最前面,按键每按下一次就切换一下。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1,*obj2;

lv_obj_t* scr;

lv_style_t style1;

int flag = 0;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            flag++;

            if(flag == 1)
            {
                lv_obj_move_foreground(obj2);
            }
            if(flag == 2)
            {
                lv_obj_move_background(obj2);
                flag = 0;
            }
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(obj1,50,50);

    // 用 copy参数将 obj1 对象上的属性值复制过来创建 obj2
    obj2 = lv_obj_create(scr,obj1);
    lv_obj_set_style(obj2,&style1);

    //初始时 obj1 位于最前面
    lv_obj_move_foreground(obj1);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

运行效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
演示代码如下:(当按键按下后,任务一被创建,然后系统每间隔 1 s 就调用一次任务一的回调函数,回调函数的内容是切换对齐方式。总共有21种对齐方式,仿照上面图片。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1,*obj2;

lv_obj_t* scr;

lv_style_t style1;

lv_task_t* task1;

// task1的回调函数 -- 注意格式
void task1_cb(lv_task_t* task)
{
    static uint32_t align = 0;

    if(align > LV_ALIGN_OUT_RIGHT_BOTTOM)
    {
        align = LV_ALIGN_CENTER;
    }

    lv_obj_align(obj2, obj1, align, 0,0);

    align++;
}

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            task1 = lv_task_create(task1_cb, 1000, LV_TASK_PRIO_MID, NULL);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);

    // 用 copy参数将 obj1 对象上的属性值复制过来创建 obj2
    obj2 = lv_obj_create(scr,obj1);
    lv_obj_set_style(obj2,&style1);
    lv_obj_set_size(obj2,50,50);
    lv_obj_set_pos(obj2,150,150);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

运行效果如下:
在这里插入图片描述
此外,还有偏移,偏移可设置为负数(表示反方向)。
在这里插入图片描述
lv_obj_align_origo 和 lv_obj_align 的对齐原理是相同的,只不过 lv_obj_align_origo 接口是以 obj 对象的中心点来跟 base 参考对象进行对齐的。

采用与上面同样的事例,只不过把函数 lv_obj_align 给替换成 lv_obj_align_origo ,来看下效果。
在这里插入图片描述
在这里插入图片描述
重复一下最后一次的对齐操作。
在这里插入图片描述
自动重新对齐函数,免去手动调用上面的重新对齐函数。
在这里插入图片描述
不讲。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
演示代码如下:(当按键按下后,默认对象 obj1 和 obj2 隐藏)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1,*obj2;

lv_obj_t* scr;

lv_style_t style1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_hidden(obj1, true);
            lv_obj_set_hidden(obj2, true);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);

    // 用 copy参数将 obj1 对象上的属性值复制过来创建 obj2
    obj2 = lv_obj_create(scr,obj1);
    lv_obj_set_style(obj2,&style1);
    lv_obj_set_size(obj2,50,50);
    lv_obj_set_pos(obj2,150,150);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

演示如下:
在这里插入图片描述
在这里插入图片描述
默认情况下,基础对象是没有开启点击事件的,比如这里的 obj1 。如果想要开启,就可以使用这里的函数来开启。

代码如下:(初始时,ob1处于隐身状态,当点击按钮后,开启 ob1 的点击事件功能,当点击 ob1 时关闭按钮的点击事件。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_obj_t* scr;

//声明一个按钮的事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_hidden(obj1, false);
            lv_obj_set_click(obj1,true);
        }
    }
}

//声明一个obj1的事件回调函数
void obj1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == obj1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_click(btn1,false);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);
     //初始时obj1处于隐身状态
    lv_obj_set_hidden(obj1, true);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置按钮的事件回调函数
    lv_obj_set_event_cb(btn1,btn1_event_cb);

    //设置obj1的事件回调函数
    lv_obj_set_event_cb(obj1,obj1_event_cb);
}

演示效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
默认情况下,基础对象和这里的按钮都是不可以被拖拽的,当调用这个接口后,所设置的那个对象就可以被拖拽。

代码如下:(初始时,ob1 处于隐身状态,当点击按钮后,关闭 ob1 隐身状态,同时允许 obj1 的拖拽功能。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_obj_t* scr;

//声明一个按钮的事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_hidden(obj1, false);
            lv_obj_set_drag(obj1, true);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);
     //初始时obj1处于隐身状态
    lv_obj_set_hidden(obj1, true);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置按钮的事件回调函数
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

在这里插入图片描述

enum {
    LV_DRAG_DIR_HOR = 0x1, /**< Object can be dragged horizontally. */
    LV_DRAG_DIR_VER = 0x2, /**< Object can be dragged vertically. */
    LV_DRAG_DIR_ALL = 0x3, /**< Object can be dragged in all directions. */
};

typedef uint8_t lv_drag_dir_t;

这三种方向,分别是水平、垂直和所有方向。

代码如下:(初始时,ob1 处于隐身状态,当点击按钮后,关闭 ob1 隐身状态,同时允许 obj1 的水平方向拖拽功能。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_obj_t* scr;

//声明一个按钮的事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_hidden(obj1, false);
            lv_obj_set_drag_dir(obj1, LV_DRAG_DIR_HOR);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);
     //初始时obj1处于隐身状态
    lv_obj_set_hidden(obj1, true);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置按钮的事件回调函数
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

演示效果如下:
在这里插入图片描述
在这里插入图片描述
使用对象调用该函数之前,首先要使能该对象的拖拽功能。

代码如下:(初始时,obj1 处于隐身状态,当点击按钮后,关闭 obj1 隐身状态,同时允许 obj1 的拖拽滑动功能。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_obj_t* scr;

//声明一个按钮的事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_hidden(obj1, false);
            lv_obj_set_drag(obj1, true);
            lv_obj_set_drag_throw(obj1, true);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置大小
    lv_obj_set_size(obj1,100,100);
    //设置坐标
    lv_obj_set_pos(obj1,80,80);
     //初始时obj1处于隐身状态
    lv_obj_set_hidden(obj1, true);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,300,80);
    //设置按钮的事件回调函数
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

演示效果如下:
在这里插入图片描述
可以看出,当拖拽控件的时候,松手后,控件还会继续向前滑动一段距离。

也有可能用力过猛,滑出窗体。演示如下:
在这里插入图片描述
在这里插入图片描述
使用对象调用该函数之前,首先要使能该对象以及该对象的父对象的拖拽功能。当拖动子对象时,父对象会跟着一起跑,当拖动父对象时,子对象也会跟着一起跑。但是如果虽然使能了子对象的拖拽功能,却没有使能父对象的拖拽功能,反而会导致子对象无法被拖拽了。

代码如下:(child1 是obj1 的子对象,当点击按钮后,使能 obj1 和 child1 的拖拽功能以及使能对象的父容器联动拖拽功能。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

lv_style_t style1;

lv_obj_t* child1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_drag(obj1, true);
            lv_obj_set_drag(child1, true);
            lv_obj_set_drag_parent(child1,true);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    lv_obj_t* scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(obj1,50,50);

    //创建一个默认对象
    child1 = lv_obj_create(obj1,NULL);
    //设置大小
    lv_obj_set_size(child1,20,20);
    //设置坐标
    lv_obj_set_pos(child1,20,20);

    //定义 lv_style_t 这种变量时要定义成静态局部变量或者定义为全局变量。
    //static lv_style_t sty1;

    //因为一个样式中的属性有很多
    //所以这里为了避免麻烦,先从一个现成的样式中进行拷贝
    //lv_style_plain_color是 LittleVGL 中自带的
    lv_style_copy(&style1,&lv_style_plain_color);

    //设置样式 -- 将个别需要修改的样式进行修改
    //style1.body.main_color是设置背景的上半部分颜色
    //style1.body.grad_color是设置背景的下半部分颜色
    //这里均设置为红色
    style1.body.main_color = LV_COLOR_RED;
    style1.body.grad_color = LV_COLOR_RED;
    lv_obj_set_style(child1,&style1);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

演示效果如下:
在这里插入图片描述
为了提高拖动的灵敏度,可以增大对象的尺寸。

如果使能了子对象的拖拽功能,没有使能父对象的拖拽功能,且没有设置联动功能,子对象也只能在父对象里面进行拖拽,如下图所示。

在这里插入图片描述
在这里插入图片描述
没举例子。
在这里插入图片描述
设置对象透明度之前需要使能对象的透明度功能。

代码如下:(当点击按钮后,使能 obj1 的透明度功能,同时将 obj1 的透明度设置为 0 。)

#include "test.h"
#include <stdio.h>

//创建一个按钮
lv_obj_t* btn1;
//创建一个默认对象
lv_obj_t* obj1;

//声明一个事件回调函数
void btn1_event_cb(lv_obj_t* obj,lv_event_t event)
{
    if(obj == btn1)
    {
        if(event==LV_EVENT_RELEASED)
        {
            lv_obj_set_opa_scale_enable(obj1,true);
            lv_obj_set_opa_scale(obj1,0);
        }
    }
}

void test_start()
{
    // lv_scr_act 是获取当前活动的屏幕对象
    lv_obj_t* scr = lv_scr_act();

    // lv_obj_create的第一个参数是parent,即指向父对象,如果传 NULL 的话,则是在创建一个 screen.
    // 第二个参数是copy,此参数可选,表示创建新对象时,把 copy 对象上的属性值复制过来,这里不使用,传NULL.
    obj1 = lv_obj_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(obj1,50,50);

    //创建按钮
    btn1 = lv_btn_create(scr,NULL);
    //设置坐标
    lv_obj_set_pos(btn1,200,50);
    //设置事件回调
    lv_obj_set_event_cb(btn1,btn1_event_cb);
}

代码运行演示如下:
在这里插入图片描述
上面的几个函数不讲。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:如果不调用该函数,就不要将这个宏使能,因为会造成内存的消耗。
在这里插入图片描述

以下是一个使用 `lv_obj_get_index` 函数的 ESP32-S3 LVGL 示例代码: ```c #include "lvgl/lvgl.h" #include "lv_examples/lv_examples.h" // 定义一个自定义的列表回调函数 static void list_button_action(lv_obj_t * button) { uint32_t index = lv_obj_get_index(button); // 获取按钮的索引 printf("Button %d is pressed\n", index); } void lvgl_example(void) { // 初始化 LVGL lv_init(); // 创建一个屏幕 lv_obj_t * screen = lv_disp_get_scr_act(NULL); // 创建一个垂直布局 lv_obj_t * layout = lv_obj_create(screen, NULL); lv_obj_set_size(layout, LV_HOR_RES, LV_VER_RES); lv_obj_set_flex_flow(layout, LV_FLEX_FLOW_COLUMN); // 创建一个列表 lv_obj_t * list = lv_list_create(layout, NULL); lv_obj_set_width(list, LV_HOR_RES); lv_obj_align(list, NULL, LV_ALIGN_CENTER, 0, 0); lv_list_set_sb_mode(list, LV_SB_MODE_AUTO); // 添加几个列表按钮 lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_OK, "Button 1"); lv_obj_set_event_cb(btn, list_button_action); lv_obj_set_index(btn, 1); // 设置按钮的索引为 1 btn = lv_list_add_btn(list, LV_SYMBOL_OK, "Button 2"); lv_obj_set_event_cb(btn, list_button_action); lv_obj_set_index(btn, 2); // 设置按钮的索引为 2 btn = lv_list_add_btn(list, LV_SYMBOL_OK, "Button 3"); lv_obj_set_event_cb(btn, list_button_action); lv_obj_set_index(btn, 3); // 设置按钮的索引为 3 // 运行 LVGL while (1) { lv_task_handler(); esp_task_wdt_reset(); vTaskDelay(1); } } ``` 在该代码中,我们创建了一个垂直布局,并在其中创建了一个列表。然后,我们添加了三个列表按钮,并分别使用 `lv_obj_set_index` 函数将它们的索引设置为 1、2 和 3。最后,我们实现了一个自定义的列表回调函数,它使用 `lv_obj_get_index` 函数获取被按下的按钮的索引,并将其打印到控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值