自学内容网 自学内容网

Flythings学习(一)基础


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个函数

  1. 用于知道列表有多少项
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 添加本地库

在这里插入图片描述
在这里插入图片描述


原文地址:https://blog.csdn.net/Lmz_0314/article/details/142868521

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!