打印
[GUI]

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

[复制链接]
744|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.素材处理
使用软件:格式工厂、Matlab
首先准备好太空人的git或者太空人的mp4。
用格式工厂改成自己需要的分辨率。




然后在采用下面的代码用Matlab来逐帧采集图片,其实还有很多别的方法,但是opencv电脑没装,就不想麻烦了。

使用特权

评论回复
沙发
鹿鼎计|  楼主 | 2022-9-6 13:55 | 只看该作者
代码中的路径按需更改
% % fig --> jpg
% r = 'H:\PersonalProducts\astronaut\human.gif';
% info = imfinfo(r);%第一次读取,用于获取属性值
% W = info.Width;
% H = info.Height;
% W = W(1);
% H = H(1);
% len = length(info);%总帧数
% for i = 1 : len   %截取每一帧
%     [Ii, map] = imread(r, 'frames', i);  %将第i帧保存为索引格式
%     I2 =ind2rgb(Ii,map);   %最关键的,将索引转为RGB格式!
%     imwrite(I2,strcat('H:\PersonalProducts\astronaut\output\astronaut_',num2str(i,'%02d'),'.','png'));
% end

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



使用特权

评论回复
板凳
鹿鼎计|  楼主 | 2022-9-6 13:55 | 只看该作者
2.Touchgfx移植

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

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

参考链接


使用特权

评论回复
地板
鹿鼎计|  楼主 | 2022-9-6 13:58 | 只看该作者
3.使用控件animated image
先把之前处理的好的会错增加到资源里

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

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


使用特权

评论回复
5
鹿鼎计|  楼主 | 2022-9-6 13:59 | 只看该作者
4.仿真和烧录看效果没有拍gif动图,其实已经是可以动的了。

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


使用特权

评论回复
6
鹿鼎计|  楼主 | 2022-9-6 14:01 | 只看该作者
5.增加启动和暂停控制
TouchGFX采用的是MPV架构,界面和底层完全分离,对于复杂的UI界面非常友好,下面的例子是基于屏幕到底层的例子,View–>Presenter–>Model。其实如果只是控制动画的变化,是只用view自己就够了,但是这样就不能通知到底层。

得先把空间自己装载先给关了。
再增加回调虚函数
生成代码后,打开头文件即可看到创建的回调函数。

然后我们在screenview.cpp里重写并实现这个函数。

void screenView::StartAnimation()
{
    if(toggleButton1.getState()){
        animatedImage1.startAnimation(false, true, true);   //不反转,重置,循环
    }else {
        animatedImage1.stopAnimation();//停止动画
    }
    animatedImage1.invalidate();    //重绘控件,必须调用
   
    presenter->button1Clicked(toggleButton1.getState());    //需在presenter定义,通知presenter,按键按下。
}

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

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

void screenPresenter::button1Clicked(bool  state)
{
    model->viewBtnClick(state);//通知model
}

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

void Model::viewBtnClick(bool  state)
{

    if(state){
        HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_RESET);
    }else {
        HAL_GPIO_WritePin(GPIOH, GPIO_PIN_7, GPIO_PIN_SET);
    }

}

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


使用特权

评论回复
7
鹿鼎计|  楼主 | 2022-9-6 14:02 | 只看该作者
以上基本就算是成功了,MPV的用法也走了一遍,下面讲讲为什么可以这么玩。

在view收到用户的交互事件的时候,不能直接和model通信,只能通过presenter,但是怎么通过presenter呢,其实在设计的时候这个view底层就已经做好了,在view里是有一个对应的screen的presenter的指针。

同样在presenter里也有一个model的指针,下面给指针地方的截图,modellistener是moder的父类。同时这个bind也会绑定对应一个的model。

单个screen界面的时候就是这样多个prensenter和多个view对应一个model,当创建多个screen节目的时候那就是多个了,每个都是对应自己的mpv关系。

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

使用特权

评论回复
8
alvpeg| | 2022-10-17 22:40 | 只看该作者
对于复杂的UI界面非常友好               

使用特权

评论回复
9
51xlf| | 2022-10-18 11:36 | 只看该作者
TouchGFX Version 4.18 ,新增了视频播放功能  

使用特权

评论回复
10
updownq| | 2022-10-18 11:56 | 只看该作者
这个动画是直接读取的吗              

使用特权

评论回复
11
pl202| | 2022-10-18 14:20 | 只看该作者
X-CUBE-DISPLAY扩展软件包,无需 TouchGFX吧  

使用特权

评论回复
12
1988020566| | 2022-10-19 20:23 | 只看该作者
Touchgfx可以在所有stm32芯片上运行?        

使用特权

评论回复
13
pl202| | 2022-10-19 21:09 | 只看该作者
免费的可以用stemwin。           

使用特权

评论回复
14
vivilyly| | 2022-10-20 09:23 | 只看该作者
有哪些带有适合的解码外设的 STM32 MCU   

使用特权

评论回复
15
sesefadou| | 2022-10-20 13:19 | 只看该作者
可以用软件或硬件进行视频解码?   

使用特权

评论回复
16
kmzuaz| | 2022-10-20 17:07 | 只看该作者
利用TouchGFX Designer软件,支持图片和控件拖拽、可快速生成在KEIL或IAR等IDE中可打开的项目工程

使用特权

评论回复
17
songqian17| | 2022-10-20 22:06 | 只看该作者
这个动画是直接读取的吗              

使用特权

评论回复
18
1988020566| | 2022-10-21 20:25 | 只看该作者
stm32f103能运行touchgfx吗      

使用特权

评论回复
19
nomomy| | 2022-10-21 22:45 | 只看该作者
TouchGFX采用的是MPV架构,界面和底层完全分离,对于复杂的UI界面非常友好

使用特权

评论回复
20
abotomson| | 2022-10-22 08:46 | 只看该作者
stm32与touchGFX交互操作难吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

1361

帖子

0

粉丝