LVGL-tileview控件

2023-11-14

控件特点

以page为基础扩展的控件,增加了释放后会有动画定格效果。

lv_tileview_set_tile_act(tileview, ext->act_id.x + x_move, ext->act_id.y + y_move, true);//切入时开启动画效果。

static void drag_end_handler(lv_obj_t * tileview)
{
    lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview);
    lv_indev_t * indev      = lv_indev_get_act();
    lv_point_t point_act;
    lv_indev_get_point(indev, &point_act);
    lv_obj_t * scrl = lv_page_get_scrollable(tileview);
    lv_point_t p;

    p.x = -(lv_obj_get_x(scrl) - lv_obj_get_width(tileview) / 2);
    p.y = -(lv_obj_get_y(scrl) - lv_obj_get_height(tileview) / 2);

    lv_drag_dir_t drag_dir = indev->proc.types.pointer.drag_dir;
    /*From the drag vector (drag throw) predict the end position*/
    if(drag_dir & LV_DRAG_DIR_HOR) {
        lv_point_t vect;
        lv_indev_get_vect(indev, &vect);
        lv_coord_t predict = 0;

        #if 0//saimen
        while(vect.x != 0) {
            predict += vect.x;  
            vect.x = vect.x * (100 - indev->driver.drag_throw) / 100;
        }
        #else
        if(vect.x>0)
        {
            predict = (LV_HOR_RES_MAX/2);
        }
        else if(vect.x<0)
        {
            predict = -(LV_HOR_RES_MAX/2);
        }
//        else
//        {
//            am_util_stdio_printf("vect.x:%d,%d\r\n",vect.x, lv_obj_get_x(scrl));
//        }
        #endif
        p.x -= predict;

    }
    else if(drag_dir & LV_DRAG_DIR_VER) {
        lv_point_t vect;
        lv_indev_get_vect(indev, &vect);
        lv_coord_t predict = 0;

        #if 0
        while(vect.y != 0) {
            predict += vect.y;
            vect.y = vect.y * (100 - indev->driver.drag_throw) / 100;
        }
        #else
        if(vect.y>0)
        {
            predict = (LV_VER_RES_MAX/2);
        }
        else if(vect.y<0)
        {
            predict = -(LV_VER_RES_MAX/2);
        }
//        else
//        {
//            am_util_stdio_printf("vect.x:%d,%d\r\n",vect.x, lv_obj_get_x(scrl));
//        }
        #endif

        p.y -= predict;
    }

    /*Get the index of the tile*/
    p.x = p.x / lv_obj_get_width(tileview);
    p.y = p.y / lv_obj_get_height(tileview);

    /*Max +- move*/
    lv_coord_t x_move = p.x - ext->act_id.x;
    lv_coord_t y_move = p.y - ext->act_id.y;
    if(x_move < -1) x_move = -1;
    if(x_move > 1) x_move = 1;
    if(y_move < -1) y_move = -1;
    if(y_move > 1) y_move = 1;

    /*Set the new tile*/
    lv_tileview_set_tile_act(tileview, ext->act_id.x + x_move, ext->act_id.y + y_move, true);
}

出错分析

容易出现1、2、3死循坏调用。原因目前未知

1、static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param)

2、lv_obj_set_x(scrl, -ext->act_id.x * lv_obj_get_width(tileview) + left);

3、obj->signal_cb(obj, LV_SIGNAL_COORD_CHG, &ori);

优化

1、释放动画速度优化

2、趋势判断

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL-tileview控件 的相关文章

随机推荐

  • android 模拟器 hardWare 特征说明

    Hardware Abstracted Lcd Density默认160 最直接的表现就是手机图标和文字的大小 120最小 可根据分辨率的大小自定义 一般推荐使用默认值即可 SD Card Support 是否支持插入 弹出闪存卡 Dpad
  • Qt_按钮触发两次槽函数

    以前使用qt creator的时候 可以直接右键转到槽构建槽函数 十分方便 void MainWindow on ptn clicked qDebug lt lt ptn lt
  • 网络部署的思路

    网络部署的思路 网络搭建的步骤 1 拓扑设计 IP地址的规划 子网划分 子网汇总 2 实施 2 1 搭建拓扑 2 2底层 给所有需要配置IP地址的网络节点 配置一个合法的IP地址 2 3路由 全网可达 2 4优化 策略 安全方面的考虑 测试
  • Inner Join 的使用和多条 Inner Join 的使用顺序要求

    一 关于 MySQL 中 Inner Join 的使用 1 1 Inner Join 简介 Inner Join 内连接 是 SQL 中最常用的连接类型之一 它用于根据两个或多个表之间的共同字段将表组合在一起 Inner Join 返回符合
  • @Transactional注解 失效场景 及 解决版本

    文章目录 失效场景 1 数据库首先要支持事务 2 数据源没有配置事务管理器 3 没有被spring管理 4 方法不是public 5 Transactional 注解属性 propagation 设置错误 6 同一个类中方法调用 导致 Tr
  • java面试核心知识点原理篇文档,逆袭进大厂

    前言 每个技术人都有个大厂梦 我觉得这很正常 并不是饭后的谈资而是每个技术人的追求 像阿里 腾讯 美团 字节跳动 京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司 小公司 如果说能够在这样的公司锻炼几年 相信对自己能力的提升还是非
  • 14.CAPE:Camera View Position Embedding for Multi-View 3D Object Detection笔记

    14 CAPE Camera View Position Embedding for Multi View 3D Object Detection CAPE 用于多视图三维物体检测的相机视图位置嵌入 CVPR2023 文章结构 摘要 1 引
  • 华为云计算之ebackup了解

    华为云计算之ebackup了解 一 ebackup介绍 二 ebackup的特点 三 ebackup的组网方式 1 Lan Free方式 2 LAN base方式 四 ebackup组网场景 一 ebackup介绍 eBackup 为华为自
  • 一阶电路实验报告心得_一阶电路实验报告5篇

    1 测量时间常数 2 微分电路 积分电路 a 微分电路 b 积分电路 时间常数 的测量 R 4K R 1K R 6K C 0 22U R 1K R 1K 三 误差分析 1 实验过程中的读数误差 2 仪器的基本误差 3 导线连接不紧密产生的接
  • 移远M26 GSM实时获取网络时间

    移远M26 GSM实时获取网络时间 1 启用同步网络时间 开启同步网络时间功能 AT QNITZ 1 响应OK 2 获取最近一次的网络同步时间 AT QLTS 响应 QLTS
  • 卷积神经网络(Convolutional Neural Network)总结

    转自 http blog sina com cn s blog 870a639201019pee html 相关网站 CNNs应用的最成功的一个例子 Yann LeCun 曾经是Hinton组的research associate http
  • 第六章 生命周期和 Ajax 服务端通信

    6 1 Vue 实例生命周期 6 1 1 生命周期钩子函数 每个 Vue 实例在被创建时都要经过一系列的初始化过程 生命周期分为三大阶段 初始化显示 更新显示 销毁Vue实例 初始化阶段的钩子函数 beforeCreate 实例创建前 数据
  • Qt中QObject::sender()的用法

    当某一个Object emit一个signal的时候 它就是一个sender 系统会记录下当前是谁emit出这个signal的 所以你在对应的slot里就可以通过 sender 得到当前是谁invoke了你的slot 对应的是QObject
  • WebRTC学习记录(2):播放音频文件原理一探

    同样的 根据上篇WebRTC学习记录 1 采集microphone到文件原理实践 讲解 我还是需要有一个可运行的例子 经过多方研究 得到如下的例子 include webrtc base ssladapter h include webrt
  • C++中的引用

    引用的概念 引用可以看作一个已定义变量的别名 引用的语法 Type name var 普通引用在声明时必须用其它的变量进行初始化 声明时必须初始化 引用的使用举例 a和b指代的都是同一段内存空间 程序输出的结果 a 5 b 5 a和b的地址
  • vue动图加载图片不能正确显示的解决方法

    vue动图加载图片不能正确显示的解决方法 解决核心 代码 运行结果 上次解决过一次 没有记录 后来发现有小伙伴问我这个问题 我今天就顺手记录一下 具体的原因我这里就不详细说 加载不出来简略的原因是vue简析地址时候把你原的地址当做了一个模块
  • jupyter notebook快捷键

    Jupyter Notebook的快捷键包括 Ctrl Enter 运行当前单元格 Shift Enter 运行当前单元格并转到下一个单元格 Alt Enter 运行当前单元格并在下面插入新单元格 Ctrl S 保存文件 Ctrl Z 撤消
  • 回调函数

    单线程的时候同步的话 很容易阻塞在那边 用户体验极差 例如 异步是可以多线程的 因为UI主线程一旦阻塞整个界面就卡死了 一旦异步 两个线程下一个可以后台处理数据 一个可以做UI显示 js是单线程的 如果所有的操作 ajax 获取文件等I O
  • mmsegmentaion环境配置cuda11.0+pytorch1.7.1

    参考 https blog csdn net CSDNxiaoh article details 125321921 官方文档 https gitcode net mirrors open mmlab 1 创建虚拟环境 conda crea
  • LVGL-tileview控件

    控件特点 以page为基础扩展的控件 增加了释放后会有动画定格效果 lv tileview set tile act tileview ext gt act id x x move ext gt act id y y move true 切