LVGL V8应用——实现互斥

2023-11-20

按键互斥

void language_setup()
{
    lv_obj_t * cont = lv_obj_create(page);
    lv_obj_set_size(cont, 320,160);

    lv_obj_t * ch_cb = lv_checkbox_create(cont);
    lv_obj_set_size(ch_cb , 100,40);
    lv_obj_set_pos(ch_cb ,10,10);

    lv_checkbox_set_text(ch_cb, "中文");
    lv_obj_add_flag(ch_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_t * en_cb = lv_checkbox_create(cont);
    lv_obj_set_size(en_cb , 100,40);
    lv_obj_set_pos(en_cb ,10,60);

    lv_checkbox_set_text(en_cb, "English");
    lv_obj_add_flag(en_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

     /*Make the first checkbox checked*/
    lv_obj_add_state(lv_obj_get_child(cont, language), LV_STATE_CHECKED);
}

复选框互斥

应用:实现中英文切换
设置language问全局变量,language=0表示中文,language=1表示英语

void init_page(lv_obj_t * page)
{
    lv_obj_t * cont = lv_obj_create(page);
    lv_obj_set_size(cont, 320,160);

    lv_obj_t * ch_cb = lv_checkbox_create(cont);
    lv_obj_set_size(ch_cb , 100,40);
    lv_obj_set_pos(ch_cb ,10,10);

    lv_checkbox_set_text(ch_cb, "中文");
    lv_obj_add_flag(ch_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_t * en_cb = lv_checkbox_create(cont);
    lv_obj_set_size(en_cb , 100,40);
    lv_obj_set_pos(en_cb ,10,60);

    lv_checkbox_set_text(en_cb, "English");
    lv_obj_add_flag(en_cb, LV_OBJ_FLAG_EVENT_BUBBLE);
	//注册回调函数的时候将language作为用户参数传入
    lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

     /*根据语言获取其中一个复选框,中文为0选中第1个,英语为1选中第2个,然后设置该复选框为选中*/
    lv_obj_add_state(lv_obj_get_child(cont, language), LV_STATE_CHECKED);
}

启用了 lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE),所有事件也将发送到对象的父级(如果父级也启用了LV_OBJ_FLAG_EVENT_BUBBLE,则事件也将发送到其父级,依此类推)。所以这里可以直接对cont注册事件,因为ch_cb、en_cb都会将事件传递到其父级,触发回调函数。

lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

触发回调函数之后:

  • 获取用户数据active_id(language地址),
  • 获取当前目标对象cont(因为事件冒泡的原因都会是复选框checkbox的父对象cont),
  • 获取最初聚焦的目标对象act_cb (有3种可能:父对象cont,子对象ch_cb ,子对象en_cb ),如果act_cb == cont,表明点击的对象是复选框checkbox周围的容器cont,直接退出不处理。
  • 根据*active_id获取父对象cont的子对象old_cb (首先创建了中文子对象ch_cb,然后创建了英文子对象 en_cb,所以通过lv_obj_get_child(cont,0)获取的是ch_cb,lv_obj_get_child(cont,1)获取的是en_cb)
  • 清除前一个子对象的点击状态,给新的子对象添加点击状态
  • 获取新的子对象索引,修改*active_id
static void language_event_handler(lv_event_t * e)
{
	//获取用户数据
    u16 * active_id = lv_event_get_user_data(e);
    lv_obj_t * cont = lv_event_get_current_target(e);
    lv_obj_t * act_cb = lv_event_get_target(e);
    lv_obj_t * old_cb = lv_obj_get_child(cont, *active_id);

    /*Do nothing if the container was clicked*/
    if(act_cb == cont) return;

    lv_obj_clear_state(old_cb, LV_STATE_CHECKED);   /*Uncheck the previous radio button*/
    lv_obj_add_state(act_cb, LV_STATE_CHECKED);     /*Uncheck the current radio button*/

    *active_id = lv_obj_get_index(act_cb);
    LV_LOG_USER("Selected radio buttons: %d", (u16)*active_id);
}

Message box实现互斥

请添加图片描述

static void language_setup(lv_ui *ui)
{
    static const char * btns[] ={"中文", "English", ""};

    ui-> mbox1 = lv_msgbox_create(NULL, "Hello", "This is a message box with two buttons.", btns, true);

    lv_obj_center(ui-> mbox1);
    //lv_msgbox_get_active_btn(ui-> mbox1);
    lv_obj_t *btnm = lv_msgbox_get_btns(ui-> mbox1);     //从Message box获取btnm子对象
    lv_obj_add_style(btnm, &style, 0);

    lv_btnmatrix_set_btn_ctrl(btnm, language, LV_BTNMATRIX_CTRL_CHECKED); //根据language设置选中按钮
    lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_VALUE_CHANGED, ui);   //注册LV_EVENT_VALUE_CHANGED时间回调函数
}
static void event_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_target(e);           //获取事件对象obj
    uint16_t id = lv_btnmatrix_get_selected_btn(obj);  //获取最后一个“激活”矩阵按钮的索引
    lv_ui * user_data = lv_event_get_user_data(e);

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        if(language==1 && id==0)
        {
            language = 0;
            lv_btnmatrix_clear_btn_ctrl(obj, 1, LV_BTNMATRIX_CTRL_CHECKED);
            lv_btnmatrix_set_btn_ctrl(obj, 0, LV_BTNMATRIX_CTRL_CHECKED);
        }
        else if(language==0 && id==1)
        {
            language = 1;
            lv_btnmatrix_clear_btn_ctrl(obj, 0, LV_BTNMATRIX_CTRL_CHECKED);
            lv_btnmatrix_set_btn_ctrl(obj, 1, LV_BTNMATRIX_CTRL_CHECKED);
        }
        set_ccd_data(LANGUAGE,language);
        LV_LOG_USER("%d \n", language);
   	   	lv_label_set_text(user_data->screen_setup_label_t, SetMenuName[language]);
     	lv_label_set_text(user_data->screen_setup_btn_bck_label, BackName[language]);
    }
}

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

LVGL V8应用——实现互斥 的相关文章

随机推荐

  • 液晶电视的MEMC(运动画质补偿技术)的优势不足

    MEMC Motion Estimate and Motion Compensation 即运动估计和运动补偿 液晶电视中用到的运动画质补偿技术 其原理是采用动态映像系统 在传统的两帧图像之间加插一帧运动补偿帧 将普通平板电视的50 60H
  • JDBC连接MySQL数据库

    开发工具与关键技术 IntelliJ IDEA java 撰写时间 2020年9月8日 一 JDBC简介 JDBC全称为 Java Data Base Connectivity java数据库连接 用Java语言操作数据库 可以为多种数据库
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • sublime text 3神奇的插件--snippet

    像之前用VS 做项目时 任意创建一个asp网页 都会自动出现一些基础的代码 毕竟是微软把大家养的太舒服 总感觉用sublime text时每次手敲一些重复代码时特别无辜 所以查阅了一下package control 终于发现了这一神器 创建
  • 斑马面试总结

    面试岗位 测试开发实习生 面试主要提问的是简历上的项目经历 测试相关的 给你一个视频软件 怎么测试 功能测试 黑盒测试 视频的封面正常 点击屏幕或播放键可以正常播放 视频时间倒计时显示正常 再次点击暂停 视频的声音 默认打开 无噪音 可以调
  • java连接sqlserver2005 tcp 有时超时,SQL Server 2005 出现到主机 的 TCP/IP 连接失败

    用jdbc连接SQL Server2005出现到主机 的 TCP IP 连接失败 java net ConnectException Connection refused connect 估计是因为sqlserver2005默认情况下是禁用
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • SpringBoot 整合slf4j 日志配置

    slf4j 即 Simple Logging Facade for Java 简单门面日志 它是对所有日志框架制定的一种规范 标准 接口 并不是一个框架的具体的实现 它只服务于各种各样的日志系统 slf4j提供了统一的记录日志的接口 对不同
  • OpenGL.ES在Android上的简单实践:14-全景(惯性滑动球体)

    OpenGL ES在Android上的简单实践 14 全景 惯性滑动球体 1 整理封装全景球 现在 我们的地球已经能正确的显示出来 我们来增加必要的交互 使得我们左右滑动屏幕的时候 地球能旋转起来 而且是像一个地球仪一样 手指离开屏幕后 能
  • 如何修改游戏服务器ip地址吗,怎么修改游戏服务器ip地址吗

    怎么修改游戏服务器ip地址吗 内容精选 换一换 AI视频分析服务作业的输出结果需要指定输出通道 请提前配置好输出通道DIS或者Webhook AI视频分析服务作业的结果输出类型选择为DIS时 在创建作业前 您需确保DIS通道已开通成功 开通
  • 分-布-式-缓-存-(转)

    在前面的一些文章中 从实战的角度 讲解了有关 memcached的应用 容灾 监控等等 但是缺乏对理论的讲解和原理性的剖析 本文将从理论的角度去介绍 让大家从宏观上对 分布式缓存 nosql 等技术有所了解 以便进一步学习和使用 在构建大规
  • tensorflow 激活函数relu6为什么是6

    普通relu y max 0 x 相当于无限多个bernoulli分布 即无限多个骰子 relu6 y min max 0 x 6 相当于有六个bernoulli分布 即6个硬币 同时抛出正面 这样鼓励网络学习到稀疏特征 网络里面每一个输出
  • Linux之rm命令

    rm 删除一个文件或者目录 删除文件可以直接使用rm命令 若删除目录则必须配合选项 r rm r 删除当前目录下的所有文件及目录 文件一旦删除 则无法恢复 命令参数 f 强制删除 即使不存在的文件也不会报错 i交互式删除 r列出全部目录和子
  • 全国热门带正文新闻查询API接口

    一 接口介绍 解决同一类新闻在不同平台上的内容获取问题 在归档主流新闻平台的内容数据基础上 对外提供统一的调用方式来完成实时 最新的相关新闻的获取 极大方便各类企业在自有软件中集成新闻内容的功能 支持200余个新闻大站 为保证数据的及时性
  • PID控制算法(PID控制原理与程序流程)

    PID控制算法 PID控制原理与程序流程 暗影玄极 博客园 cnblogs com
  • RFID系统组成及其功能

    RFID系统因应用不同其组成会有所不同 但基本原理都是相似的 下面我们来讨论一下射频识别的基本原理 既然是射频识别 则必然要由读写器和电子标签组成 当然 在应用中通常还包含上层的管理系统 电子标签和读写器都要装有天线 以便于通信交流 其中读
  • Scratch资料

    Scratch软件是免费的 免费的 免费的 任何需要花钱才能下载Scratch软件的全是骗子 1 什么是Scratch Scratch是麻省理工学院的 终身幼儿园团队 开发的一种图形化编程工具 是面向青少年的一款模块化 积木化 可视化的编程
  • 【RF-SSA-LSTM】随机森林-麻雀优化算法优化时间序列预测研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 RF特征选择 2 2 LSTM预测 2 3 SSA LSTM预测 2 4 MLP预测
  • JDK不同版本间的新特性-基础篇

    目录 一 JDK环境部署 1 1 JDK18与IDEA2022环境准备 二 JDK9 10新特性 2 1 JDK9新特性 私有接口方法 2 2 JDK9新特性 通过try块自动关闭资源 2 4 JDK10新特性 var动态类型推断 局部变量
  • LVGL V8应用——实现互斥

    按键互斥 void language setup lv obj t cont lv obj create page lv obj set size cont 320 160 lv obj t ch cb lv checkbox create