LVGL可拖拽窗口实现

这篇具有很好参考价值的文章主要介绍了LVGL可拖拽窗口实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 LVGL拖拽功能

    LVGL obj提供了使能拖拽功能的函数:

lv_obj_set_drag(win, true);

    不过在多元素界面,例如下边在 bg win上创建了若干个 sub win,bg win大部分面积被覆盖的情况下,如果单纯将 bg win 设置为可拖拽,则只有点击到  没有被覆盖的区域才能成功,效果不满足要求;如果简单的把 sub win 也设置为可拖拽,结果是在 bg win中拖拽。       
  LVGL可拖拽窗口实现

 二、通过回调函数实现功能

     要实现的功能可通过事件触发时候改变 win 位置实现,如下,在初始化弹出窗口时候将占用面积较大的面板都添加回调函数,这样只要点击到这些地方都能成功触发

void uiInit(uint8_t popUpFlag)
{
    //init
    *****

    if(popUpFlag)	
    {
	    lv_obj_set_event_cb(ui->win, homePopUpUIDragEvCb);
	    lv_obj_set_event_cb(ui->sub1.win, homePopUpUIDragEvCb);
	    lv_obj_set_event_cb(ui->sub2.win, homePopUpUIDragEvCb);
	    lv_obj_set_event_cb(ui->sub3.win, homePopUpUIDragEvCb);
    }
}

    在回调函数中在 LV_EVENT_PRESSING 等事件中获取偏移量然后更新 win 位置,优点是还可以限制拖拽边界等一系列操作。

void homePopUpUIDragEvCb(lv_obj_t* obj, lv_event_t e)
{
    if (e == LV_EVENT_PRESSING)
    {
	    lv_indev_t* indev = lv_indev_get_act(); //获取输入设备
	    if (indev == NULL)  return;

	    lv_point_t vect;
	    lv_indev_get_vect(indev, &vect);  //获取输入坐标位移向量

        if( vect.x != 0 || vect.y !=0 )
		{
			lv_coord_t x = lv_obj_get_x(getHomePUUI()->win) +vect.x;
			lv_coord_t y = lv_obj_get_y(getHomePUUI()->win)+ vect.y;
			lv_obj_set_pos(getHomePUUI()->win, (x<0)?0:((x>LV_HOR_RES_MAX-1-150)?(LV_HOR_RES_MAX-1-150):x), (y<0)?0:((y>LV_VER_RES_MAX-1-50)?(LV_VER_RES_MAX-1-50):y));//Limit drag boundaries 
		}
    }
    else if (e == LV_EVENT_PRESS_LOST)
    {
		lv_obj_set_ext_click_area(getHomePUUI()->win, 100, 100, 100, 100); //expand click area when press lost
    }
	else if (e == LV_EVENT_RELEASED)
    {
		lv_obj_set_ext_click_area(getHomePUUI()->win, 0, 0, 0, 0); //expand click area clear when released
    }
}


更新:

        以上实现方式虽然增加了点击面积,但在指针离开 obj容易断触。

        通过学习 lvgl源码 触摸 obj 判定部分,了解到 obj存在 protect 属性,其中一个保护项 LV_PROTECT_PRESS_LOST 为:若 press 后离开 obj区域,但未断触,则不更新 判定obj。

        因此,在配置回调时增加 该属性就可保证拉动不断触

lv_obj_set_event_cb(ui->sub1.win, homePopUpUIDragEvCb);
lv_obj_add_protect(ui->sub1.win, LV_PROTECT_PRESS_LOST);		//when press out of obj, don't change act obj

LVGL可拖拽窗口效果

三、使能拖拽结合回调?

        直接使能拖拽后窗口拖拽可能拖到边边,没法拉回来,通过开启回调,类似 “二" 中设置方式设置可以限制边缘。

        另外有 LV_EVENT_DRAG_BEGIN(拖拽开始时触发)、LV_EVENT_DRAG_END(拖拽结束时触发)、LV_EVENT_DRAG_THROW_BEGIN (带初速度(动量)的拖动动作开始时会触发?) 三个事件,在使能拖拽后才会触发。

        是否存在设置子对象跟随父对象拖拽的功能?     文章来源地址https://www.toymoban.com/news/detail-425232.html

到了这里,关于LVGL可拖拽窗口实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Three.js实现模型,模型材质可拖拽效果 DragControls

    DragControls:是一个用于在Three.js中实现拖拽控制的辅助类。它简化了在Three.js中实现拖拽物体的过程。 DragControls的构造函数接受三个参数: objects:一个包含需要进行拖拽的物体的数组。 camera:相机对象,用于将屏幕坐标转换为三维空间坐标。 domElement:渲染器的DOM元素,用于

    2024年02月11日
    浏览(26)
  • 【python可视化大屏】使用python实现可拖拽数据可视化大屏

    我在前几期分享了关于爬取weibo评论的爬虫,同时也分享了如何去进行数据可视化的操作。但是之前的可视化都是单独的,没有办法在一个界面上展示的。这样一来呢,大家在看的时候其实是很不方便的,就是没有办法一目了然的看到数据的规律。为了解决这个问题我使用p

    2024年02月03日
    浏览(38)
  • vue+echart实现3d地图可拖拽、缩放、区域填充颜色(geo3D)

    功能背景 一个略微比2d地图炫酷一些的3d地图, 1、可对区域进行不同颜色填充。 2、可拖拽缩放地图 3、鼠标悬停高亮某区域。 (注意:当开启了鼠标悬停series,并高亮某个数据的时候,会导致地图的拖拽缩放出现卡顿,因为相当于是事件重叠了。。。目前还没想到好的解决方

    2024年02月13日
    浏览(33)
  • vue2实现可拖拽甘特图(结合element-ui的gantt图)

      接到公司需求,要做一个可拖拽的甘特图来实现排期需求,官方的插件要付费还没有中文的官方文档可以看,就去找了各种开源的demo来看,功能上都不是很齐全,于是总结了很多demo,合在一起组成了一版较为完整的满足需求的甘特图。 1.拖拽  拖拽功能是甘特图的主要功

    2024年02月03日
    浏览(36)
  • Vue中使用vue-drag-resize实现窗体可拖拽和随意缩放大小

    若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_ruoyi本地调式_霸道流氓气质的博客-CSDN博客 在上面的基础上,实现弹窗窗体可移动以及随意缩放大小。 效果如下   注: 博客: https://blog.csdn.net/badao_liumang_qizhi 

    2024年02月11日
    浏览(29)
  • django boostrap html实现可拖拽的左右布局,鼠标拖动调整左右布局的大小或占比

          最近需要在Django项目中,实现一个左右布局的html页面,页面框架使用的是boostrap。但这个布局不是简单的左右分栏布局,而是需要实现可以通过鼠标拖拽的方式动态调整左右两侧布局的大小和占比。效果大致如下:         一开始,页面分为左右两块布局:   鼠标放

    2024年02月13日
    浏览(28)
  • Vue:可拖拽组件

            在实际开发中,很可能会遇到开发可拖拽组件的需求,目的是应对某些弹框组件会遮盖某些重要信息/可操作面板,通过可拖拽的形式可以将上层的弹框组件移动到其他位置,从而不影响整个系统的操作。下面,我们分两步走,开发一个可拖拽的弹框组件,最终效果如

    2024年02月12日
    浏览(27)
  • Unity打包窗口化放大、缩小、拖拽功能、无边框设置 C#

    Unity无边框设置、窗口化放大、缩小、拖拽 提示:PC端打包,测试尽量在打包后测试。 编辑器下测试会有意想不到的后果呦~~ [DllImport(\\\"user32.dll\\\")] 。 代码如下: 代码如下:注释详细,不懂就问哈 代码整体已贴出,功能亲测可用,欢迎学习交流。点赞+收藏+关注哦~

    2024年02月16日
    浏览(37)
  • 可拖拽编辑的流程图X6

     先上图

    2024年02月11日
    浏览(31)
  • vue 进度条组件(可拖拽可点击)

    在日常的开发当中,随着项目的需求复杂化,自定义组件也越来越常见,而且扩展性也比一些组件库要更加全面,比如视频播放器的进度条。 可自定义设置以下属性: 当前进度value,默认50 是否可拖拽isDrag,默认true 设置最小值min,默认0 设置最大值max,默认100 进度条颜色

    2024年02月16日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包