[GUI] stm32 基于TouchGFX显示视频动画的详细制作过程和讲解

[复制链接]
 楼主| 鹿鼎计 发表于 2022-9-6 13:54 | 显示全部楼层 |阅读模式
1.素材处理
使用软件:格式工厂、Matlab
首先准备好太空人的git或者太空人的mp4。
用格式工厂改成自己需要的分辨率。

8785d41ad78f03f112c3832c90a774f8.png




然后在采用下面的代码用Matlab来逐帧采集图片,其实还有很多别的方法,但是opencv电脑没装,就不想麻烦了。
 楼主| 鹿鼎计 发表于 2022-9-6 13:55 | 显示全部楼层
代码中的路径按需更改
  1. % % fig --> jpg
  2. % r = 'H:\PersonalProducts\astronaut\human.gif';
  3. % info = imfinfo(r);%第一次读取,用于获取属性值
  4. % W = info.Width;
  5. % H = info.Height;
  6. % W = W(1);
  7. % H = H(1);
  8. % len = length(info);%总帧数
  9. % for i = 1 : len   %截取每一帧
  10. %     [Ii, map] = imread(r, 'frames', i);  %将第i帧保存为索引格式
  11. %     I2 =ind2rgb(Ii,map);   %最关键的,将索引转为RGB格式!
  12. %     imwrite(I2,strcat('H:\PersonalProducts\astronaut\output\astronaut_',num2str(i,'%02d'),'.','png'));
  13. % end

  14. % mp4 --> jpg
  15. apple='H:\PersonalProducts\astronaut\astronaut.mp4';
  16. obj = VideoReader(apple);
  17. for i=1 : 60 %视频3秒,每秒30帧
  18.     astronaut = read(obj,i);
  19.     imwrite(astronaut,strcat('H:\PersonalProducts\astronaut\output\',num2str(i,'%02d'),'.','png'));
  20. end



 楼主| 鹿鼎计 发表于 2022-9-6 13:55 | 显示全部楼层
2.Touchgfx移植

这里就不做讲解了,每个人板子不一样,配置不同。

可以参考这个大佬的移植,非常详细。

参考链接


 楼主| 鹿鼎计 发表于 2022-9-6 13:58 | 显示全部楼层
3.使用控件animated image
先把之前处理的好的会错增加到资源里

efb5f3e90e9aeef6f0f73e5eb0778e0e.png

8da6617f3364edd444dc83491234ddf2.png

dba253dfa3224d6ed1dfd2e785db0f3c.png

这里的意思是开始图片和最后一张图片,还有更新间隔,我们测试的话先打开自动加载选项。

**注意:**它不是在第一和第二张照片之间切换,而是从第一张持续到最后一张,但是图片资源的命名要按照固定格式来。比如: name_01.png -----------> name_xx.png


 楼主| 鹿鼎计 发表于 2022-9-6 13:59 | 显示全部楼层
4.仿真和烧录看效果没有拍gif动图,其实已经是可以动的了。

资源的话,内部Flash是绝对不够的,可以采用QSPI映射内存地址的方法,也可以采用从sd卡读取图片资源的方法(这个后期我有时间会写个文章),这里采用QSPI的方法,这个方法有制作好的算法才行,如果是自己制作的板子可以到官方找例程来改生成FLM烧录算法,如果是网上的板子,找店家要就行了。

91f75161df809d803bbedee7ca11efab.png

f9e76dff0316615084dfa28275697c7c.png


 楼主| 鹿鼎计 发表于 2022-9-6 14:01 | 显示全部楼层
5.增加启动和暂停控制
TouchGFX采用的是MPV架构,界面和底层完全分离,对于复杂的UI界面非常友好,下面的例子是基于屏幕到底层的例子,View–>Presenter–>Model。其实如果只是控制动画的变化,是只用view自己就够了,但是这样就不能通知到底层。
da71b31c358d41699e4ffb40fbfd6292.png
得先把空间自己装载先给关了。
再增加回调虚函数
生成代码后,打开头文件即可看到创建的回调函数。

0a61633f4ba7c14670a01b5a071d1bc0.png

68322c5aee6919fa7c4f196ac991befe.png

4842a7f7c0b3fe69346f79f8da9cc0da.png

然后我们在screenview.cpp里重写并实现这个函数。
529990714d49ed325022ab0e27780a40.png
  1. void screenView::StartAnimation()
  2. {
  3.     if(toggleButton1.getState()){
  4.         animatedImage1.startAnimation(false, true, true);   //不反转,重置,循环
  5.     }else {
  6.         animatedImage1.stopAnimation();//停止动画
  7.     }
  8.     animatedImage1.invalidate();    //重绘控件,必须调用
  9.    
  10.     presenter->button1Clicked(toggleButton1.getState());    //需在presenter定义,通知presenter,按键按下。
  11. }

如果不需要通知底层,那把最后一行删掉,也就成功了。

hpp中增加定义,在cpp里定义。

801d778ca2b12aa35a45808ec9400bfe.png

91627294bb4424d4761a92cbe4031963.png

  1. void screenPresenter::button1Clicked(bool  state)
  2. {
  3.     model->viewBtnClick(state);//通知model
  4. }

然后再在model里同样的做法。

e16e743d2a556a7a68e1be3812dd3975.png

41bd8f061bfa218053c1966303b3b075.png

  1. void Model::viewBtnClick(bool  state)
  2. {

  3.     if(state){
  4.         HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
  5.     }else {
  6.         HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_SET);
  7.     }

  8. }

**注意:**我这里包含了main.h,用的cubemx生成的会有extern {}的那个,如果是自己弄的要注意,c和c++一起的时候要这样弄,不然编译错误。


 楼主| 鹿鼎计 发表于 2022-9-6 14:02 | 显示全部楼层
以上基本就算是成功了,MPV的用法也走了一遍,下面讲讲为什么可以这么玩。
11b621dad135d34cc10e99135620c5d9.png
在view收到用户的交互事件的时候,不能直接和model通信,只能通过presenter,但是怎么通过presenter呢,其实在设计的时候这个view底层就已经做好了,在view里是有一个对应的screen的presenter的指针。
a405a51e31b591e9db2d3aef3532e2fa.png
同样在presenter里也有一个model的指针,下面给指针地方的截图,modellistener是moder的父类。同时这个bind也会绑定对应一个的model。
994422f84c7dc7b3b6993c3bb0536601.png
单个screen界面的时候就是这样多个prensenter和多个view对应一个model,当创建多个screen节目的时候那就是多个了,每个都是对应自己的mpv关系。

如果是简单界面相比于lvgl可能有点麻烦了,但是当复杂界面的时候优势就非常明显了,各个界面显示分层,还可以进行各个对应的单元测试等等。

alvpeg 发表于 2022-10-17 22:40 | 显示全部楼层
对于复杂的UI界面非常友好               
51xlf 发表于 2022-10-18 11:36 | 显示全部楼层
TouchGFX Version 4.18 ,新增了视频播放功能  
updownq 发表于 2022-10-18 11:56 | 显示全部楼层
这个动画是直接读取的吗              
pl202 发表于 2022-10-18 14:20 | 显示全部楼层
X-CUBE-DISPLAY扩展软件包,无需 TouchGFX吧  
1988020566 发表于 2022-10-19 20:23 | 显示全部楼层
Touchgfx可以在所有stm32芯片上运行?        
pl202 发表于 2022-10-19 21:09 | 显示全部楼层
免费的可以用stemwin。           
vivilyly 发表于 2022-10-20 09:23 | 显示全部楼层
有哪些带有适合的解码外设的 STM32 MCU   
sesefadou 发表于 2022-10-20 13:19 | 显示全部楼层
可以用软件或硬件进行视频解码?   
kmzuaz 发表于 2022-10-20 17:07 | 显示全部楼层
利用TouchGFX Designer软件,支持图片和控件拖拽、可快速生成在KEIL或IAR等IDE中可打开的项目工程
songqian17 发表于 2022-10-20 22:06 | 显示全部楼层
这个动画是直接读取的吗              
1988020566 发表于 2022-10-21 20:25 | 显示全部楼层
stm32f103能运行touchgfx吗      
nomomy 发表于 2022-10-21 22:45 | 显示全部楼层
TouchGFX采用的是MPV架构,界面和底层完全分离,对于复杂的UI界面非常友好
abotomson 发表于 2022-10-22 08:46 | 显示全部楼层
stm32与touchGFX交互操作难吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

1932

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部