Flythings学习(二)控件相关

文章目录

  • 1 前言
  • 2 通用属性
    • 2.1 控件ID值
    • 2.2 控件位置
    • 2.3 背景色
    • 2.4 背景图
    • 2.5 显示与隐藏
    • 2.6 控件状态
    • 2.7 蜂鸣器控制
  • 3 文本类TextView
  • 4 按键类 Button
    • 4.1 系统按键
    • 4.2 处理按钮长按事件
    • 4.3 处理按键触摸事件
  • 5 复选框CheckBox
  • 6 单选组 RadioGroup
  • 7 进度条,滑块
    • 7.1 如何控制滑块的进度
  • 8 指针仪表控件
  • 9 列表控件
    • 9.1 设置列表项的显示内容
    • 9.2 设置列表子项的显示内容
  • 10 编辑框
  • 11 窗口
  • 12 滑动窗口


1 前言

本系列笔记根据flythings官方文档进行学习,连接如下,相关下载在文档中的环境安装部分
https://developer.flythings.cn/zh-hans/

2 通用属性

2.1 控件ID值

ID值作为控件的唯一标识,每一个FTU文件里的控件ID值是不允许重名的,不同的ftu文件里的控件ID值允许重名;设置id后,编译完全会在activity目录下对应的头文件中生成相应的宏定义

在这里插入图片描述
所有控件都能使用

/*** 该接口定义于控件基类ZKBase中* 头文件位置: include/control/ZKBase.h** 注意: 以下接口如未特殊说明,都表示定义在ZKBase类中* 所有控件直接或间接的继承了ZKBase类,所以,所有的控件都可以调用ZKBase类中public接口*/
int getID() const;/* 操作样例: 点击按钮控件,打印该控件ID值 */
static bool onButtonClick_Button1(ZKButton *pButton) {int id = pButton->getID();LOGD("onButtonClick_Button1 id %d\n", id);return false;
}

2.2 控件位置

在这里插入图片描述

// 设置位置
void setPosition(const LayoutPosition &position);
// 获取位置
const LayoutPosition& getPosition();

样例

/* 操作样例 */
// 点击按钮控件,设置该按钮位置
static bool onButtonClick_Button1(ZKButton *pButton) {// 左:0,上:0,宽:100,高:200LayoutPosition pos(0, 0, 100, 200);pButton->setPosition(pos);return false;
}// 点击按钮控件,获取该按钮位置
static bool onButtonClick_Button2(ZKButton *pButton) {// pos的mLeft、mTop、mWidth、mHeight变量分别对应的就是坐标值LayoutPosition pos = pButton->getPosition();return false;
}

2.3 背景色

/*** Z6、Z11、A33平台接口定义* color为-1时,背景设置为透明;其他颜色值为0x RGB,颜色值不支持alpha*/
void setBackgroundColor(int color);/*** H500S、Z20、Z21及以后平台接口定义* color 颜色值为0x ARGB,支持alpha*/
void setBackgroundColor(uint32_t color);/* 操作样例: 点击按钮控件,设置背景颜色为红色 */
static bool onButtonClick_Button1(ZKButton *pButton) {pButton->setBackgroundColor(0xFFFF0000);return false;
}

2.4 背景图

在这里插入图片描述

/*** pPicPath参数可以有以下两种方式:* 1. 绝对路径,如:"/mnt/extsd/pic/bg.png"* 2. 相对资源目录路径,只需把图片放到项目工程resources目录下,编译打包后,就可以使用了,如resources目录下有bg.png图片,只需设置"bg.png"即可*/
void setBackgroundPic(const char *pPicPath);/* 操作样例 */
mButton1Ptr->setBackgroundPic("/mnt/extsd/pic/bg.png"); // 设置绝对路径
mButton1Ptr->setBackgroundPic("bg.png");    // 设置resources目录下bg.png图片

2.5 显示与隐藏

void setVisible(bool isVisible);
bool isVisible() const;
/* 操作样例 */
mButton1Ptr->setVisible(true);  // 显示按钮控件
mButton1Ptr->setVisible(false); // 隐藏按钮控件/*** 窗口控件还可以使用下面的接口,功能一样* 头文件位置: include/window/ZKWindow.h*/
void showWnd();  // 显示窗口
void hideWnd();  // 隐藏窗口
bool isWndShow() const;  // 窗口是否显示/* 操作样例 */
mWindow1Ptr->showWnd();
mWindow1Ptr->hideWnd();

2.6 控件状态

在这里插入图片描述

// 设置选中状态
void setSelected(bool isSelected);
bool isSelected() const;/* 操作样例 */
mButton1Ptr->setSelected(true);
mButton1Ptr->setSelected(false);/*** 无效状态作用说明:控件设置为无效状态情况下,触摸控件没有作用,即不响应按下抬起事件*/
// 设置无效状态
void setInvalid(bool isInvalid);
bool isInvalid() const;/* 操作样例 */
mButton1Ptr->setInvalid(true);
mButton1Ptr->setInvalid(false);

2.7 蜂鸣器控制

在这里插入图片描述

// 所有控件都支持beep接口,以下为操作样例
mButton1Ptr->beep();// 全局控制蜂鸣器
#include "manager/ConfigManager.h"
// 接口参数说明: true 开启、false 关闭
CONFIGMANAGER->setBeepEnable(true);

3 文本类TextView

通过代码动态更新文本内容
比如通过点击一个按钮,更新文字内容

static bool onButtonClick_Button1(ZKButton *pButton) {mTextView1Ptr->setText("Hello World");return false;
}/* 操作样例 */
mTextView1Ptr->setText(123); // TextView1控件将显示"123"字符串
mTextView1Ptr->setText('c'); // TextView1控件将显示'c'字符

修改文字颜色大小等,可以通过控件更改,也可以通过代码更改

   //将控件TextView1 设置为无效状态;如果属性表中`无效时颜色`属性不为空,则将其设置为指定的颜色,否则无变化。mTextView1Ptr->setInvalid(true);//将控件TextView1 设置为选中状态;如果属性表中`选中时颜色`属性不为空,则将其设置为指定的颜色,否则无变化。mTextView1Ptr->setSelected(true);//将控件TextView1 设置为按下状态;如果属性表中`按下时颜色`属性不为空,则将其设置为指定的颜色,否则无变化。mTextView1Ptr->setPressed(true);//将控件TextView1 设置为红色。mTextView1Ptr->setTextColor(0xFF0000);

4 按键类 Button

在这里插入图片描述
在Logic.cc中设计点击函数

static bool onButtonClick_Button1(ZKButton *pButton) {//LOGD(" ButtonClick Button1 !!!\n");return false;
}

4.1 系统按键

除了自己定义的ID值外,按键还保留了两个系统按键值:sys_backsys_home ,从名字上我们大致可以知道它们的功能:返回键 和 Home键 ;点击返回键,界面会回到上一界面,如果进入了多层级的界面,点击Home键可以直接回到主界面(启动界面)。我们只需在按键的属性框中把ID值设置为 sys_back 或 sys_home ,就可以实现相应的功能。
在这里插入图片描述

4.2 处理按钮长按事件

在这里插入图片描述
这两个默认值是-1,可以进行相应设置
在这里插入图片描述
设置属性后,编译,打开对应的Logic.cc文件,在文件顶部,声明class LongClickListenner并继承
ZKBase::ILongClickListener类,实现virtual void onLongClick(ZKBase *pBase)方法

namespace { // 加个匿名作用域,防止多个源文件定义相同类名,运行时冲突//实现长按监听接口class LongClickListener : public ZKBase::ILongClickListener {virtual void onLongClick(ZKBase *pBase) {  LOGD("触发长按事件");static int count = 0;char buf[128] = {0};snprintf(buf, sizeof(buf), "长按事件触发次数 %d", ++count);//每次触发长按事件,修改按键的文字mLongButtonPtr->setText(buf);}};}

实例化监听类,设置为静态类型

 static LongClickListener longButtonClickListener;

在onUI_init()函数中注册按键长按监听

 static void onUI_init(){//注册按键长按监听mLongButtonPtr->setLongClickListener(&longButtonClickListener);}

在onUI_quit()中取消监听

 static void onUI_quit() {//取消按键长按监听mLongButtonPtr->setLongClickListener(NULL);}

4.3 处理按键触摸事件

实现监听接口类,继承自ITouchListener

 namespace {    // 加个匿名作用域,防止多个源文件定义相同类名,运行时冲突// 实现触摸监听接口class TouchListener : public ZKBase::ITouchListener {public:virtual void onTouchEvent(ZKBase *pBase, const MotionEvent &ev) {switch (ev.mActionStatus) {case MotionEvent::E_ACTION_DOWN:mTouchButtonPtr->setText("按下");break;case MotionEvent::E_ACTION_UP:mTouchButtonPtr->setText("抬起");break;default:break;}}};}

实例化监听类,并声明为静态类型

 static TouchListener sTouchListener;

在 static void onUI_init() 函数中注册按键触摸监听

 static void onUI_init() {//注册按键触摸监听mTouchButtonPtr->setTouchListener(&sTouchListener);}

在static void onUI_quit()函数中取消按键触摸监听

 static void onUI_quit() {//取消按键触摸监听mTouchButtonPtr->setTouchListener(NULL);}

5 复选框CheckBox

在拖入复选框后,在对应的Logic.cc中会产生关联函数,当点击控件时,关联函数会被系统调用
当点击控件时,关联函数会被调用

static void onCheckedChanged_Checkbox1(ZKCheckBox* pCheckBox, bool isChecked) {if (isChecked) {//复选框 为 选中状态LOGD("选中");} else {//复选框 为  未选中状态LOGD("未选中");} 
}

pCheckBox是该控件
isChecked时是否选中状态

6 单选组 RadioGroup

多个选项只能选择一个选项,组中选项的ID能在Activity.h中看到
在这里插入图片描述
在logic.cc中会自动创建关联函数

 static void onCheckedChanged_RadioGroup1(ZKRadioGroup* pRadioGroup, int checkedID) {LOGD("选中项的ID = %d", checkedID);switch (checkedID) {case ID_MAIN_RadioButton1:LOGD("第一项被选中");break;case ID_MAIN_RadioButton2:LOGD("第二项被选中");break;case ID_MAIN_RadioButton3:LOGD("第三项被选中");break;default:break;}}

checkedID是被选中的选项的ID

7 进度条,滑块

在这里插入图片描述
要准四张图片资源,分别是
背景图
有效图
滑块
滑块按下
在这里插入图片描述

7.1 如何控制滑块的进度

添加ui后,编译会自动添加在对应的.cc文件中
当进度条改变时,会自动调用函数

static void onProgressChanged_XXXX(ZKSeekBar *pSeekBar, int progress) {//LOGD("XXXX滑块的进度值变化为 %d !\n", progress);
}

设置滑块当前进度

//将滑块进度设置为28
mSeekbarPtr->setProgress(28)

获得滑块的当前进度

int progress = mSeekbarPtr->getProgress();
LOGD("当前滑块的进度值为 %s", progress);

8 指针仪表控件

需要两个图片资源,背景图和指针图片

在这里插入图片描述
通过代码设置指针的旋转角度

//将指针调整到90度
mPointer1Ptr->setTargetAngle(90.0);

9 列表控件

需要插入两个东西,一个是列表,一个是列表子项
在这里插入图片描述
有三个函数,在第一章讲过
int getListItemCount_ListView1(): 获取将要绘制列表的长度
例如: 要显示的数据有100条, 那么就返回100。
void obtainListItemData_List1: 具体设置列表每一项的显示内容 具体例子参见后续文档 以上两个函数共同控制着列表的显示内容。更具体的函数调用流程。
onListItemClick_List1: 列表控件的点击事件 当点击列表中的某一项时,系统会调用该函数,参数index 表示 当前被点击列表项的索引值。

9.1 设置列表项的显示内容

列表项,指列表组中的一个列表项中的内容

static void obtainListItemData_ListView1(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {//pListItem指针表示列表项, 该指针只能在这个函数内当中使用char buf[32] = {0};//参数index表示 当前绘制的是列表的第几项,从0开始。//这里,我们将index值格式化到字符串中snprintf(buf, sizeof(buf), "第%d项", index);//将字符串作为文字显示到列表项区域pListItem->setText(buf);//如果你在ui文件中,已经配置好了 列表项 "选中时的图片“,//那么,通过以下这行代码设置列表项的选中状态,即可控制列表项显示对应状态的图片pListItem->setSelected(true);
}

9.2 设置列表子项的显示内容

列表项中的列表子项

static void obtainListItemData_ListView1(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {char buf[32] = {0};//参数index表示 当前绘制的是列表的第几项,从0开始。//这里,我们将index值格式化到字符串中snprintf(buf, sizeof(buf), "第%d项的第一个子项", index);//我们可以通过findSubItemByID()函数以及列表子项的ID,得到列表子项的指针//与pListItem指针相同,查找得到的列表子项指针也只能在这个函数内当中使用ZKListView::ZKListSubItem* subitem1 = pListItem->findSubItemByID(ID_MAIN_SubItem1);if (subitem1 != NULL) {//设置列表子项1的文字subitem1->setText(buf);}snprintf(buf, sizeof(buf), "第%d项的第二个子项", index);ZKListView::ZKListSubItem* subitem2 = pListItem->findSubItemByID(ID_MAIN_SubItem2);if (subitem2 != NULL) {//设置列表子项2的文字subitem2->setText(buf);}
}

10 编辑框

一个可供输入的编辑框
获得模拟键盘的输入内容

static void onEditTextChanged_XXXX(const std::string &text) {//LOGD("当前输入的内容为 %s \n", text.c_str());
}// 获得字符串
const char* str = text.c_str();// 字符串转换为数字static void onEditTextChanged_EditText1(const std::string &text) {
int number = atoi(text.c_str());
LOGD("字符串转为数字 = %d", number);
}static void onEditTextChanged_EditText1(const std::string &text) {
// atof函数可以将字符串转为对应的浮点数,比如 “3.14” 可以转为整形 3.14
//如果参数不规范,会造成转换失败,统一返回 数字 0
double f = atof(text.c_str());
LOGD("字符串转为浮点数 = %f", f);
}
```cpp

11 窗口

界面中可以出现多个窗口
窗口中可以添加其他组件并自定义大小和位置

一般来说,通过触摸滑动来上下翻页,但也有相应函数

// 切换到下一页,有动画
mPageWindow1Ptr->turnToNextPage(true);
// 切换到下一页,无动画
mPageWindow1Ptr->turnToNextPage(false);// 切换到上一页,有动画
mPageWindow1Ptr->turnToPrevPage(true);
// 切换到上一页,无动画
mPageWindow1Ptr->turnToPrevPage(false);

监听翻刀了第几页

 namespace { // 加个匿名作用域,防止多个源文件定义相同类名,运行时冲突// 实现自己的监听接口class MyPageChangeListener : public ZKPageWindow::IPageChangeListener {public:virtual void onPageChange(ZKPageWindow *pPageWindow, int page) {LOGD("当前切换到第%d页", page);}};}// 定义监听对象static MyPageChangeListener sMyPageChangeListener;static void onUI_init() {mPageWindow1Ptr->setPageChangeListener(&sMyPageChangeListener);}// 获取当前是第几页
int i = mPageWindow1Ptr->getCurrentPage();
LOGD("当前是第%d页", i);

滚动窗口类似于手机主界面上下或者左右滚动的界面效果
由一个滚动窗口、一个窗口和多个控件组成

12 滑动窗口

在这里插入图片描述
滑动窗口中的图标会自行进行排列,也可以手动调整间距等属性

代码操作

// 切换到上一页,有动画
mSlideWindow1Ptr->turnToPrevPage(true);
// 切换到上一页,无动画
mSlideWindow1Ptr->turnToPrevPage(false);// 切换到下一页,有动画
mSlideWindow1Ptr->turnToNextPage(true);
// 切换到下一页,无动画
mSlideWindow1Ptr->turnToNextPage(false);
 namespace { // 加个匿名作用域,防止多个源文件定义相同类名,运行时冲突// 实现自己的监听接口class MySlidePageChangeListener : public ZKSlideWindow::ISlidePageChangeListener {public:virtual void onSlidePageChange(ZKSlideWindow *pSlideWindow, int page) {LOGD("当前切换到第%d页", page);}};}// 定义监听对象static MySlidePageChangeListener sMySlidePageChangeListener;static void onUI_init() {mSlidewindow1Ptr->setSlidePageChangeListener(&sMySlidePageChangeListener);}

监听后,可以自己设置点击或长按等相关操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446387.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu卸载Mysql【ubuntu 24.04/mysql 8.0.39】

一、准备工作 查看ubuntu版本号 查看mysql版本号(如果没有安装mysql,这一步省略) 二、Ubuntu上卸载mysql(如果没有安装mysql这一步省略) 在Ubuntu上卸载MySQL可以通过以下步骤进行,确保完全移除MySQL相关的包和数据: 1. 停止MySQL服务 在卸载之前…

verilog端口使用注意事项

下图存在组合逻辑反馈环,即组合逻辑的输出反馈到输入(赋值的左右2边存在相同的信号),此种情况会造成系统不稳定。比如在data_in20的情况下,在data_out0 时候,输出的数据会反馈到输入,输入再输出,从而造成不…

java项目之基于vue的工厂车间管理系统的设计源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于vue的工厂车间管理系统的设计。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于vu…

QT开发--多线程

第十四章 多线程 QThread 是 Qt 中实现多线程编程的核心类,提供跨平台线程管理。 使用 QThread 有两种方法: 1、 继承 QThread:重写 run() 方法,实现线程的具体操作。Qt4.8 之前较常用。 2、 使用 QObject 和 moveToThread()&…

树莓派应用--AI项目实战篇来啦-17.YOLOv8目标检测-安全帽检测

1. YOLOv8介绍 YOLOv8是Ultralytics公司2023年推出的Yolo系列目标检测算法,可以用于图像分类、物体检测和实例分割等任务。YOLOv8作为YOLO系列算法的最新成员,在损失函数、Anchor机制、样本分配策略等方面进行了全面优化和创新。这些改进不仅提高了模型的…

深入理解Transformer的笔记记录(精简版本)NNLM → Word2Vec

文章的整体介绍顺序为: NNLM → Word2Vec → Seq2Seq → Seq2Seq with Attention → Transformer → Elmo → GPT → BERT 自然语言处理相关任务中要将自然语言交给机器学习中的算法来处理,通常需要将语言数学化,因为计算机机器只认数学符号。向量是人把自然界的东西抽象出…

iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14,基于 AVPictureInPictureController,实现自定义画中画,涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求: 真机,不能使用模拟器;iO…

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者,希望在Android端低延迟的播放RTMP或RTSP流,本文就目前市面上主流2个直播播放框架,做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器,具有以下特点和功能: 广泛的格式支持…

FFmpeg的简单使用【Windows】--- 简单的视频混合拼接

实现功能 点击【选择文件】按钮在弹出的对话框中选择多个视频,这些视频就是一会将要混剪的视频素材,点击【开始处理】按钮之后就会开始对视频进行处理,处理完毕之后会将处理后的文件路径返回,并在页面展示处理后的视频。 视频所…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段,即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段,构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

JAVA就业笔记4——第二阶段(1)

课程须知 A类知识:工作和面试常用,代码必须要手敲,需要掌握。 B类知识:面试会问道,工作不常用,代码不需要手敲,理解能正确表达即可。 C类知识:工作和面试不常用,代码不…

Redis:分布式 - 主从复制

Redis:分布式 - 主从复制 概念配置主从模式info replicationslave-read-onlytcp-nodelay 命令slaveof 主从结构一主一从一主多从 主从复制流程数据同步命令全量同步部分同步实时同步 节点晋升 概念 Redis的最佳应用,还是要在分布式系统中。对于非分布式…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析: 1. FROM 功能:指定待扩展的父级镜像&#…

【Linux系列】写入文本到文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

智慧乡村可视化设计,让美丽的乡村更加魅力。

智慧乡村可视化设计为美丽的乡村注入了新的活力,使其更加魅力四射。 通过可视化设计,乡村的自然风光得以更生动地展现。高清的全景图像、实时的视频监控,让人们仿佛身临其境,感受乡村的青山绿水、田园风光。 古老的村落、宁静的…

关于int*的*号归属权问题

再根据函数指针定义:int (*int) (int a)。我们发现*和后面的标识符才是一体的 所以int *a,b;的写法更好,说明a是指针类型,b是int类型

Python_函数式编程(生成器、迭代器、动态性)

简单说:时间换空间!想要得到庞大的数据,又想让它占用空间少,那就用生成器!延迟计算!需要的时候,再计算出数据! 创建生成器的方式二(生成器函数)生成器函数: 如果一个函数…

算法修炼之路之位运算

目录 一:位运算符及一些常用结论总结 1.给一个数n,确定它的二进制表示中的第x位是0还是1(位数从右向左0开始增加) 2.将一个数n的二进制表示形式的第x位修改成1 3.将一个数n的二进制表示的第x位修改为0 4.提取一个数n的二进制表示中最右侧的1 5.干掉一个数n的…

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…

24/10/12算法笔记 VGG

VGG特点: 1.深度:非常深 2.卷积核采用3*3,使得网络能够捕捉到更细粒度的图像特征 3.全连接层:使用全连接层来分类 4.使用ReLU激活函数,有助于缓解梯度消失 5.在卷积层和池化层后,使用局部归一化&#…