前言
同Android 类似,中科世为的FlyThings OS 的GUI并没有提供直接的gif 播放控件,所以需要播放动图的时候特别麻烦。
因此文档开挂,直接基于TextView控件做一个GIF控件出来播放gif动画。
准备工作
硬件
- 准备好一片SV50PD的主板,没有的话淘宝自己买:淘宝购买 。 当然如果对平台足够熟悉的话可以自行编译libgif的静态库再连接。这里为了方便使用,建议就直接选择功能牛x,价格低廉的Linux一体机SV50PD了。
- 然后自然就是USB 调试线了。
软件工具
- FlyThings IDE,用过的自然就会知道了。不清楚的从developer.flythings.cn 下载
- 下载Demo工程,里面就已经包含了(见文末下载方法)
按照文档流程导入项目
源码说明
需要一个基本的控件
可以选择textview只显示,也可以选择Button支持按键触控
初始化gif的控件
#include "gif/CGifPlayer.h"
CGifPlayer* gif;
CGifPlayer* gif2;
...
/***
gif播放结束的回调接口
**/
bool gifplaycallback(){
return 0;
}
/**
* 当界面构造时触发
*/
static void onUI_init(){
//Tips :添加 UI初始化的显示代码到这里,如:mText1Ptr->setText("123");
gif = new CGifPlayer(mTextViewgifPtr);
gif2 = new CGifPlayer(mTextViewGif2Ptr);
}
开始播放
/*
* 当界面显示时触发
*/
static void onUI_show() {
// 开始播放页面
gif->play("/mnt/extsd/ui/logo.gif",0);
}
退出页面,删除对象
/*
* 当界面完全退出时触发
*/
static void onUI_quit() {
delete gif; // 删除gif对象
}
彩蛋
这里用到了一个内存bmp画到控件的方法,在官方的文档中是没有的。这里可以借用这个方法实现任意控件的扩展哦。
首先,FlyThings UI里面所有的空间都支持一个接口叫
// 在ZKBase.h 里面,
void setBackgroundBmp(struct _bitmap_t *pBmp);
这里的重点就是_bitmap_t 这个结构体的应用
创建这个结构
头文件结构体准备
/***
* 仅用于Z21的定义,用于setbackgroundbmp的结构体
*/
typedef struct _bitmap_t {
uint8_t bmType;
uint8_t bmBitsPerPixel;
uint8_t bmBytesPerPixel;
uint8_t bmAlpha;
uint32_t bmColorKey;
uint32_t bmWidth;
uint32_t bmHeight;
uint32_t bmPitch;
uint8_t* bmBits;
uint8_t* bmAlphaMask;
uint32_t bmAlphaPitch;
uint64_t bmPhyAddr;
} bitmap_t;
创建这个内存的方法
static bitmap_t* _create_bmp(int w, int h, int bpp) {
bitmap_t *bmp = (bitmap_t *)calloc(1, sizeof(bitmap_t));
bmp->bmBytesPerPixel = bpp;
bmp->bmBitsPerPixel = bpp * 8;
bmp->bmWidth = w;
bmp->bmHeight = h;
bmp->bmPitch = w * bpp;
bmp->bmBits = (uint8_t *) malloc(bmp->bmPitch * bmp->bmHeight);
return bmp;
}
应用的方法
bitmap_t* bmp = _create_bmp(fp->SWidth,fp->SHeight,4);
mTextView->setBackgroundBmp(bmp);
刷新控件的方法
mTextView->setInvalid(!mTextView->isInvalid());
删除内存
这里很特殊,不用删除这个内存,因为控件销毁的时候GUI会自动销毁关联的内存块。
至此,搞定了一个自定义控件了,接下来看两个控件的显示效果吧
下载方法
链接:https://pan.baidu.com/s/1EQr1l3nwOrfAOYG3I6PGlA
提取码:kiko