在实际应用中,可能会使用roller控件实现时间选择功能,选项列表只有24小时的时候,界面显示是正常的。但当选项列表是60分钟的时候,由于列表过长,显示就会出现问题。如众多帖子描述,只需要在lv_conf.h中打开宏 LV_USE_LARGE_COORD 即可。

虽然解决了显示问题,却发现在roller控件创建的时候耗时严重,尤其是当程序运行在资源有限的嵌入式设备上,问题更加明显,进而导致页面打开卡顿,影响体验。

换一种思路,如果每次只设置5个选项给roller控件,在每次滚动时重新计算并设置选项列表……

#define OPTION_FMT       "%02d\n%02d\n%02d\n%02d\n%02d"    // 选项列表格式
#define MASTER_INDEX     2                                 // 列表为5项,中间项索引为2
#define OPTION_LEN       32                                // 列表字符串buffer长度/*** @brief 选项列表最大值最小值
*/
typedef struct {int min;int max;
} roller_range_t;/*** @brief 计算选项列表* @param val 当前选中的值* @param buf 选项列表字符串buffer* @param len 选项列表字符串buffer长度* @param min 控件选项列表最小值* @param max 控件选项列表最大值
*/
static void calc_roller_option( int val, char* buf, int len, int min, int max )
{int left1  = val - 1;int left2  = val - 2;int right1 = val + 1;int right2 = val + 2;int range = max - min + 1;if ( left1 < min ) {left1 += range;}if ( left2 < min ) {left2 += range;}if ( right1 > max ) {right1 -= range;}if ( right2 > max ) {right2 -= range;}snprintf( buf, len, OPTION_FMT, left2, left1, val, right1, right2 );return;
}/*** @brief roller控件事件回调函数* @param e
*/
static void roller_event_cb( lv_event_t* e )
{if ( LV_EVENT_VALUE_CHANGED == lv_event_get_code( e ) ) {lv_obj_t* obj = lv_event_get_target( e );roller_range_t* range = (roller_range_t*)(obj->user_data);char buf[OPTION_LEN] = "\0";int val = 0;lv_roller_get_selected_str( obj, buf, OPTION_LEN );val = atoi( buf );calc_roller_option( val, buf, OPTION_LEN, range->min, range->max );lv_roller_set_options( obj, buf, LV_ROLLER_MODE_NORMAL );    // 这里不需要设置无限模式,计算列表时已处理列表循环lv_roller_set_selected( obj, MASTER_INDEX, LV_ANIM_OFF );}return;
}/*** @brief 创建roller控件* @param parent 父窗体* @param def_val 默认值* @param min_val 最小值* @param max_val 最大值* @return 已创建的roller对象指针
*/
static lv_obj_t* create_roller( lv_obj_t* parent, int def_val, int min_val, int max_val )
{lv_obj_t* roller = lv_roller_create( parent );roller_range_t* range = (roller_range_t*)malloc( sizeof( roller_range_t ) );if ( NULL != range ) {range->min = min_val;range->max = max_val;}roller->user_data = (void*)range;char option[OPTION_LEN] = "\0";calc_roller_option( def_val, option, OPTION_LEN, min_val, max_val );lv_roller_set_options( roller, option, LV_ROLLER_MODE_NORMAL );lv_roller_set_selected( roller, MASTER_INDEX, LV_ANIM_OFF );lv_obj_add_event_cb( roller, roller_event_cb, LV_EVENT_VALUE_CHANGED, NULL );return roller;
}/*** @brief 设置roller当前值* @param roller 控件对象* @param val 当前值
*/
static void set_roller_cur_val( lv_obj_t* roller, int val )
{roller_range_t* range = (roller_range_t*)(roller->user_data);char buf[OPTION_LEN] = "\0";calc_roller_option( val, buf, OPTION_LEN, range->min, range->max );lv_roller_set_options( roller, buf, LV_ROLLER_MODE_NORMAL );lv_roller_set_selected( roller, MASTER_INDEX, LV_ANIM_OFF );
}void main( void )
{lv_obj_t* roller1 = create_roller( lv_scr_act(), 0, 0, 59 );lv_roller_set_visible_row_count( roller1, 3 );lv_obj_center( roller1 );set_roller_cur_val( roller1, 24 );return;
}

轻松实现超长选项列表的roller控件,不仅分散了创建roller时设置option的耗时,避免页面创建时卡顿,同时也可以不需要 LV_USE_LARGE_COORD 的支持。

【LVGL】roller选项列表问题相关推荐

  1. lvgl roller(滑动列表控件)

    源代码: static void roller_event_handler(lv_obj_t * obj, lv_event_t event) {if (event == LV_EVENT_VALUE ...

  2. 自定义QListWidget实现item被hover时改变图标样式(模仿网易云音乐选项列表)(方法二)

    环境配置 :MinGW + QT 5.12 效果图: 这里需要说明一下:QListWidget是鼠标press时item就会被选中,自定义的TestListWidget类重写了mousePressEv ...

  3. 自定义QListWidget实现item被hover时改变图标样式(模仿网易云音乐选项列表)(方法一)

    环境配置 :MinGW + QT 5.12 效果图: 这里需要说明一下:QListWidget是鼠标press时item就会被选中,自定义的TestListWidget类重写了mousePressEv ...

  4. 记——通过点击表头弹出筛选选项列表,点击进行数据筛选

    要求 a.点击表头弹出列表 b.点击筛选内容进行数据筛选 c.允许多条件 d.当点击筛选选项列表之外的区域时,列表收起 e.筛选选项列表宽度与列宽度保持一致 f.筛选选项列表需要有横向滚动条 实现 a ...

  5. php curl选项列表(超详细)

    第一类:对于下面的这些option的可选参数,value应该被设置一个bool类型的值: 选项 可选value值 备注 CURLOPT_AUTOREFERER当根据Location:重定向时,自动设置 ...

  6. python如何画出多个独立的图使用turtle_从选项列表一次绘制多个形状(Python-Turtle图形)?...

    因此,首先,要求如下:用户从6个形状列表中选择3个形状 用户选择尺寸.填充颜色和线条颜色 用户不能选择同一形状两次 形状应均匀分布,每个形状占屏幕的1/3 以下是我目前为止的代码:import tur ...

  7. GUI怎么能缺少列表, LVGL『List列表控件』介绍

    一. LVGL GUI列表控件的概念 列表是从背景页面和其上的按钮构建的.按钮包含一个可选的类似图标的图像(也可以是一个符号)和一个 Label.当列表足够长时,可以滚动它. 二. LVGL GUI列 ...

  8. node.js运行js_Node.js运行时v8选项列表

    node.js运行js Node.js can be invoked with an incredibly various set of options. 可以使用各种不同的选项来调用Node.js. ...

  9. LVGL 源码分析大全

    LVGL 源码分析大全目录 1.概述 2.已完成源码分析文章列表 2.1.硬件抽像层(hal) 2.2.核心框架(core/misc) 2.3.定制功能 2.4.内部接口 2.5.案例讲解 2.6.其 ...

  10. html 多项选择,选项标签中的HTML多字段选择

    这可以通过switch语句实现,但这不是最好的方法.我建议将以下函数作为change事件的事件处理程序.您还需要在窗口加载时运行它,以初始化它. function updateSel() { var ...

最新文章

  1. sql查询 关联帖子_从零学会sql,复杂查询
  2. iOS中MVC设计模式
  3. linux终端使用python3,3 个 Python 命令行工具 | Linux 中国
  4. Page.ClientScript、ClientScript、ScriptManager、ClientScriptManager等的详细解说
  5. 理解T-SQL: 触发器
  6. Java中调用FTP服务时inputStream获取一直为null
  7. Could not find artifact org.olap4j:olap4j:pom:0.9.7.309-JS-3 in alimaven
  8. VMware 修复 Workstation、Fusion 和 ESXi中的多个漏洞
  9. 利用辗转相除法求两个数的最大公约数
  10. maya藤蔓插件_MAYA快速打造藤蔓生长的路径动画教程
  11. 技术发展杂谈——RTC、WebRTC、VP9(2018年的文章)
  12. 【测绘程序设计】坐标反算神器V1.0(附C/C#/VB源程序)
  13. 哈佛,斯坦福和麻省理工学院等投资加密货币基金
  14. MySQL提权——udf提权
  15. win10如何解决Excel双击打开显示灰色空白?
  16. 手机实名认证接口有哪些类别?
  17. 运营商IMS网间互联互通组网关键技术研究
  18. matlab获取全局变量的值_MATLAB中搜索、查询和全局变量的用法(摘录)
  19. java服务容器_Java容器和Docker这种服务容器差别?
  20. 手机App三年内将彻底消失?

热门文章

  1. 如何将 Mac 镜像到电视
  2. 蔡高厅高等数学18-函数在一点处的连续、函数在区间内的连续、两类间断点的判断
  3. 向日葵和teamviewer免费版的替代品RD远控。
  4. 华为服务器维护宝典,华为交换机在江湖之维护宝典,用户登录教你玩转密码
  5. matlab财务建模,探讨MATLAB结合EXCEL在财务管理建模中的一个综合运用
  6. Java家庭收支记账系统
  7. 简约记账系统基于android,基于Android平台的记账系统的设计与实现
  8. html开网站弹窗代码大全,网页弹窗代码大全
  9. 2019美赛C题论文解读
  10. 计算机维修需要工具,小200个电脑维护工具,都能去开个维修店了