LVGL:何时用到焦点?为什么要用到?

开发环境:PC,visual studio
问题:焦点,输入设备
目的:想通过在屏幕上点击鼠标,然后获取当前的鼠标坐标。

我在网上找了很久类似问题,但好像都扯到了输入设备和焦点。我不太理解,还有就是FOUCUSED这个事件标志。
有人能给我讲解一下这个东西吗? 很疑惑

有人吗,真的很疑惑啊。来人来人来人来人

我目前想到的有两种方法:

  1. 在鼠标的 read_cb 函数中获取坐标
  2. lvgl有3个图层( Layers),默认使用的是 lv_scr_act() ,分配一个回调函数给 lv_scr_act() 或他的子对象,当被鼠标按下选中之后读取坐标。

在解决这个问题之前,建议你先学习LVGL的一些教程,比如输入设备的移植、定时器等。

lvgl基础教程学习:LVGL开源GUI零基础入门课程(韦东山·监制) 教程基于lvgl v8.2版本,课程适配多个平台、多款板子(Linux单片机GUI、littleVGL教程)_哔哩哔哩_bilibili
lvgl移植教程:LVGL移植实战教程,基于DShanMCU-RA6M5(瑞萨MCU)开发套件、LVGL V8.3,LVGL移植教程_哔哩哔哩_bilibili

十分感谢,我去看看教程,感谢感谢

1 个赞

你好,我看了输入设备的章节内容,对于你说的两个方法我的理解如下:
1.read_cb里面获取坐标:这是我一直想实现的,然后我的想法就是上面贴的代码,但不知道为什么indev_mouse结构体没有值。但是在lv_indev_read_timer_cb里面打开关于pointer的输出是可以看到坐标的,我不太理解跟我的read_cb有什么区别,不都是indev_mouse这个全局结构体吗。除了一个timer的作用?
2.这个是指,加入一个obj,然后加入到group里面操作吗?

方法一:这里你已经通过驱动接口获取到x、y坐标值了

方法二:lvgl官方文档就有参考: http://lvgl.100ask.net/8.2/widgets/obj.html#make-an-object-draggable

方法二其实很简答, 当有obj被点击时,直接通过 lv_indev_get_vect 获取触摸点的坐标值

不好意思,打扰了
关于方法一:
static void mouse_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
/Get the current x and y coordinates/
mouse_get_xy(&data->point.x, &data->point.y);
LV_LOG_ERROR(“x = %d , y=%d\n”, data->point.x, data->point.y);

/*Get whether the mouse button is pressed or released*/
if(mouse_is_pressed()) {
    data->state = LV_INDEV_STATE_PR; 
}
else {
    data->state = LV_INDEV_STATE_REL;
}

}

/Return true is the mouse button is pressed/
static bool mouse_is_pressed(void)
{
/Your code comes here/
//if (indev_mouse->proc.state == LV_INDEV_STATE_PRESSED)
//{
// return 1;
//}
return false;
}

代码不做任何修改,读不到任何东西。我看了底层的代码逻辑从:lv_indev_drv_register
→ lv_indev_read_timer_cb → indev_pointer_proc → indev_proc_press 这一链路,最后在indev_proc_press ()里面打开打印是可以看到坐标的,但这和mouse_read什么的有关联吗? 这才是我的疑惑点

回调函数mouse_read就是这链路中的一环并且还是最关键的一环,因为这是输入设备数据的来源,有这个数据lvgl才能继续后面的操作,UI才能响应用户的点击操作。

在 mouse_read 中进行操作不会修改到lvgl本身的代码,所以如果你使用这个方法最好在 mouse_read 中添加你的代码。

百度搜一下LVGL物理按键控制界面切换,就需要知道聚焦到哪个控件上面,确认后才知道跳到哪