文章目录
- [1 前言](#1 前言)
- [2 项目结构](#2 项目结构)
- [3 UI控件与指针变量的关联](#3 UI控件与指针变量的关联)
- [4 UI文件和Logic.cc的关系](#4 UI文件和Logic.cc的关系)
-
- [4.1 REGISTER_ACTIVITY_TIMER_TAB[ ] 注册定时器](#4.1 REGISTER_ACTIVITY_TIMER_TAB[ ] 注册定时器)
- [4.2 void onUI_init() 界面初始化](#4.2 void onUI_init() 界面初始化)
- [4.3 void onUI_quit() 界面退出](#4.3 void onUI_quit() 界面退出)
- [4.4 void onProtocolDataUpdate(const SProtocolData &data)](#4.4 void onProtocolDataUpdate(const SProtocolData &data))
- [4.5 bool onUI_Timer(int id)](#4.5 bool onUI_Timer(int id))
- [4.6 bool onmainActivityTouchEvent(const MotionEvent &ev)](#4.6 bool onmainActivityTouchEvent(const MotionEvent &ev))
- [5 总结ftu文件和代码对应的关系](#5 总结ftu文件和代码对应的关系)
- [6 控件命名规则](#6 控件命名规则)
- [7 控件自动生成的关联函数](#7 控件自动生成的关联函数)
-
- [7.1 按键控件](#7.1 按键控件)
- [7.2 编辑输入框控件](#7.2 编辑输入框控件)
- [7.3 滑块控件](#7.3 滑块控件)
- [7.4 滑动窗口控件](#7.4 滑动窗口控件)
- [7.5 列表控件](#7.5 列表控件)
- [8 添加本地库](#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文件中拥有的函数,默认生成的,其他的控件在讲到控件部分再说
cpp
/**
* 注册定时器
* 填充数组用于注册定时器
* 注意: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[ ] 注册定时器
cpp
/**
* 注册定时器
* 填充数组用于注册定时器
* 注意:id不能重复
*/
static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
//{0, 6000}, //定时器id=0, 时间间隔6秒
//{1, 1000},
};
S_ACTIVITY_TIMEER 结构体的数据类型如下
cpp
typedef struct {
int id; // 定时器ID , 不能重复
int time; // 定时器 时间间隔 单位 毫秒
}S_ACTIVITY_TIMEER;
4.2 void onUI_init() 界面初始化
cpp
/**
* 当界面构造时触发
*/
static void onUI_init(){
//Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
}
用于界面初始化,用于在打开这个UI界面的时候,如果需要初始化一些内容,可以将代买添加到这里
4.3 void onUI_quit() 界面退出
cpp
/*
* 当界面完全退出时触发
*/
static void onUI_quit() {
}
用于界面退出时,可以将代码添加到这个函数里
4.4 void onProtocolDataUpdate(const SProtocolData &data)
cpp
/**
* 串口数据回调接口
*/
static void onProtocolDataUpdate(const SProtocolData &data) {
}
用于接收串口数据。当解析到串口数据帧时,会调用该函数。
实际上,在activity的OnCreate中会进行串口数据的注册,在析构中取消注册。
当串口读到数据时,通过ProtocalParser中的void notifyProtocolDataUpdate(const SProtocolData &data)依次调用已注册的UI界面。
cpp
/**
* 解析每一帧数据
*/
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)
cpp
/**
* 定时器触发函数
* 不建议在此函数中写耗时操作,否则将影响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)
cpp
/**
* 有新的触摸事件时触发
* 参数: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 按键控件
cpp
static bool onButtonClick_XXXX(ZKButton *pButton) {
return false;
}
pButton是被点击按键的指针,通过该指针可以对控件进行操作,和mxxxxPtr所指向的对象是同一对象
7.2 编辑输入框控件
cpp
static void onEditTextChanged_XXXX(const std::string &text) {
}
text是当前输入框中的完整字符串
7.3 滑块控件
cpp
static void onProgressChanged_XXXX(ZKSeekBar *pSeekBar, int progress) {
}
pSeekbar是滑块控件的指针
progress是当前进度值
7.4 滑动窗口控件
cpp
static void onSlideItemClick_XXXX(ZKSlideWindow *pSlideWindow, int index) {
}
pslidewindow是滑动窗口控件的指针,
index是被点击图标的索引,如果该滑动窗口添加了10个图标,则索引范围是【0,9】
7.5 列表控件
列表控件有3个函数
- 用于知道列表有多少项
cpp
static int getListItemCount_XXXX(const ZKListView *pListView) {
return 0;
}
plistview是该指针控件的指针
return 的0是要自己写多少的
2.用于知道每一项显示的哪些内容
cpp
static void obtainListItemData_XXXX(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {
//pListItem->setText(index)
}
plistview是该指针控件的指针
plistItem是item表项的指针
index是表项再整个列表中的索引值
比如说我有的控件中有3个表项,我点了第二个表项,此时的plistItem指向第二个表项,index为1
3.点击事件函数
cpp
static void onListItemClick_XXXX(ZKListView *pListView, int index, int id) {
//LOGD(" onListItemClick_ Listview1 !!!\n");
}
plistview是该指针控件的指针
index是被点击的表项在表中的索引值
id是被点击控件的整型id
这个id用于区分点击的哪一个表项
cpp
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 添加本地库