文章目录
- 1 前言
- 2 项目结构
- 3 UI控件与指针变量的关联
- 4 UI文件和Logic.cc的关系
- 4.1 REGISTER_ACTIVITY_TIMER_TAB[ ] 注册定时器
- 4.2 void onUI_init() 界面初始化
- 4.3 void onUI_quit() 界面退出
- 4.4 void onProtocolDataUpdate(const SProtocolData &data)
- 4.5 bool onUI_Timer(int id)
- 4.6 bool onmainActivityTouchEvent(const MotionEvent &ev)
- 5 总结ftu文件和代码对应的关系
- 6 控件命名规则
- 7 控件自动生成的关联函数
- 7.1 按键控件
- 7.2 编辑输入框控件
- 7.3 滑块控件
- 7.4 滑动窗口控件
- 7.5 列表控件
- 8 添加本地库
1 前言
本系列笔记根据flythings官方文档进行学习,连接如下,相关下载在文档中的环境安装部分
https://developer.flythings.cn/zh-hans/
2 项目结构
简单介绍
ui文件夹中存储ui文件,后缀是.ftu
resources文件夹存储资源文件夹,包括图片字体等
src 文件夹存储三个部分
activity:最好不要修改,生成ui文件后,会自动生成activity类和logic.cc文件
logic:存放代码逻辑,自定义代码主要添加到Logic.cc文件中
uart:存放串口操作相关的代码,包括读写串口,协议解析等
Main.cpp:一般不做修改
3 UI控件与指针变量的关联
UI生成后,会在自动生成的activity文件中生成静态全局变量,并且include了相对应的.cc文件,所以可以使用这些控件指针
4 UI文件和Logic.cc的关系
这是自动生成的cc文件中拥有的函数,默认生成的,其他的控件在讲到控件部分再说
/*** 注册定时器* 填充数组用于注册定时器* 注意:id不能重复*/
static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {//{0, 6000}, //定时器id=0, 时间间隔6秒//{1, 1000},
};/*** 当界面构造时触发*/
static void onUI_init(){//Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");}/*** 当切换到该界面时触发*/
static void onUI_intent(const Intent *intentPtr) {if (intentPtr != NULL) {//TODO}
}/** 当界面显示时触发*/
static void onUI_show() {}/** 当界面隐藏时触发*/
static void onUI_hide() {}/** 当界面完全退出时触发*/
static void onUI_quit() {}/*** 串口数据回调接口*/
static void onProtocolDataUpdate(const SProtocolData &data) {}/*** 定时器触发函数* 不建议在此函数中写耗时操作,否则将影响UI刷新* 参数: id* 当前所触发定时器的id,与注册时的id相同* 返回值: true* 继续运行当前定时器* false* 停止运行当前定时器*/
static bool onUI_Timer(int id){switch (id) {default:break;}return true;
}/*** 有新的触摸事件时触发* 参数:ev* 新的触摸事件* 返回值:true* 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上* false* 触摸事件将继续传递到控件上*/
static bool onmainActivityTouchEvent(const MotionEvent &ev) {return false;
}
这些函数拥有相应的生命周期,这部分会在后面详细讲,这里简单提一下
关闭时
相应API的详解
4.1 REGISTER_ACTIVITY_TIMER_TAB[ ] 注册定时器
/*** 注册定时器* 填充数组用于注册定时器* 注意:id不能重复*/
static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {//{0, 6000}, //定时器id=0, 时间间隔6秒//{1, 1000},
};
S_ACTIVITY_TIMEER 结构体的数据类型如下
typedef struct {int id; // 定时器ID , 不能重复int time; // 定时器 时间间隔 单位 毫秒
}S_ACTIVITY_TIMEER;
4.2 void onUI_init() 界面初始化
/*** 当界面构造时触发*/
static void onUI_init(){//Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");}
用于界面初始化,用于在打开这个UI界面的时候,如果需要初始化一些内容,可以将代买添加到这里
4.3 void onUI_quit() 界面退出
/** 当界面完全退出时触发*/
static void onUI_quit() {}
用于界面退出时,可以将代码添加到这个函数里
4.4 void onProtocolDataUpdate(const SProtocolData &data)
/*** 串口数据回调接口*/
static void onProtocolDataUpdate(const SProtocolData &data) {}
用于接收串口数据。当解析到串口数据帧时,会调用该函数。
实际上,在activity的OnCreate中会进行串口数据的注册,在析构中取消注册。
当串口读到数据时,通过ProtocalParser中的void notifyProtocolDataUpdate(const SProtocolData &data)依次调用已注册的UI界面。
/*** 解析每一帧数据*/static void procParse(const BYTE *pData, UINT len) {switch (MAKEWORD(pData[3], pData[2])) {case CMDID_POWER:sProtocolData.power = pData[5];break;}// 通知协议数据更新notifyProtocolDataUpdate(sProtocolData);}
4.5 bool onUI_Timer(int id)
/*** 定时器触发函数* 不建议在此函数中写耗时操作,否则将影响UI刷新* 参数: id* 当前所触发定时器的id,与注册时的id相同* 返回值: true* 继续运行当前定时器* false* 停止运行当前定时器*/
static bool onUI_Timer(int id){switch (id) {default:break;}return true;
}
定时器回调函数,当某个定时器达到规定的时间间隔后,系统将调用该函数,可以通过id参数区分定时器,返回true继续当前计时器,返回false暂停当前计时器
4.6 bool onmainActivityTouchEvent(const MotionEvent &ev)
/*** 有新的触摸事件时触发* 参数:ev* 新的触摸事件* 返回值:true* 表示该触摸事件在此被拦截,系统不再将此触摸事件传递到控件上* false* 触摸事件将继续传递到控件上*/
static bool onmainActivityTouchEvent(const MotionEvent &ev) {return false;
}
回调函数在对应的activity中注册,返回true就拦截,不再传递到控件上
返回false则表示触摸时间继续传递到控件上
5 总结ftu文件和代码对应的关系
6 控件命名规则
指针变量名由三部分构成。 分别为固定的小写 m 作为前缀 + ID名 + Ptr 作为结尾
其他的
相应ID的宏定义
分别为固定的大写 ID 、大写的UI文件名、控件ID属性名称构成。
7 控件自动生成的关联函数
生成的关联函数需要自己更改名字
各个控件生成的函数不同
7.1 按键控件
static bool onButtonClick_XXXX(ZKButton *pButton) {return false;}
pButton是被点击按键的指针,通过该指针可以对控件进行操作,和mxxxxPtr所指向的对象是同一对象
7.2 编辑输入框控件
static void onEditTextChanged_XXXX(const std::string &text) {}
text是当前输入框中的完整字符串
7.3 滑块控件
static void onProgressChanged_XXXX(ZKSeekBar *pSeekBar, int progress) {}
pSeekbar是滑块控件的指针
progress是当前进度值
7.4 滑动窗口控件
static void onSlideItemClick_XXXX(ZKSlideWindow *pSlideWindow, int index) {}
pslidewindow是滑动窗口控件的指针,
index是被点击图标的索引,如果该滑动窗口添加了10个图标,则索引范围是【0,9】
7.5 列表控件
列表控件有3个函数
- 用于知道列表有多少项
static int getListItemCount_XXXX(const ZKListView *pListView) {return 0;
}
plistview是该指针控件的指针
return 的0是要自己写多少的
2.用于知道每一项显示的哪些内容
static void obtainListItemData_XXXX(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {//pListItem->setText(index)
}
plistview是该指针控件的指针
plistItem是item表项的指针
index是表项再整个列表中的索引值
比如说我有的控件中有3个表项,我点了第二个表项,此时的plistItem指向第二个表项,index为1
3.点击事件函数
static void onListItemClick_XXXX(ZKListView *pListView, int index, int id) {//LOGD(" onListItemClick_ Listview1 !!!\n");
}
plistview是该指针控件的指针
index是被点击的表项在表中的索引值
id是被点击控件的整型id
这个id用于区分点击的哪一个表项
static void onListItemClick_XXXX(ZKListView *pListView, int index, int id) {//LOGD(" onListItemClick_ Listview1 !!!\n");switch(id) {case ID_MAIN_SubItem1://LOGD("点击了列表第%d项的第一个子项", index);break;case ID_MAIN_SubItem2://LOGD("点击了列表第%d项的第二个子项", index);break;}
}
8 添加本地库