你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32基于TouchGFX的GUI开发(二):简单动画实现(Animated Image)

[复制链接]
STMCU小助手 发布时间:2022-3-11 21:57
一、GUI设计" |: A  b: d: r1 f
1、界面布局

; M$ t% h2 y3 D, n# r# M$ ~按照下图添加三个控件,分别是1、Button,2、Image,3、Animated Image。& V% \: [% U1 M
其中Button添加不同相应状态的图片,Image 添加背景图片作为整个屏幕的背景,添加方法在上一节有介绍,在这就不做赘述。
" x/ z1 i9 s, n  T" w7 {7 l" M- ~; X
三个控件的属性:
0 ]) ^0 K; A' M# E1、 Name:btn_start_stop
: M' n9 H0 ~! C       Location X:175 Y200
5 o- F1 W; ^+ k4 K8 v- X+ _3 j1 r7 K1 Z6 a+ T" n
2、 Name:background: f/ w" O) @, g8 _" f& k# y& |* Z
       Location X:0 Y 0' F7 t1 p9 k! }+ W3 d

" i+ R2 b- e* v# j: A& Z3、 Name:animation8 m- ~* ?2 b6 j, u
       Location X:160 Y 20
, h) g) i, {7 t8 {
! Z" P2 R& S# }0 @ _7VV%5_QAI}GRT5N]2V00RN.png ! j* G3 c2 Z5 Y) G( o

' s. ]3 u& h- R3 K! M1 E2 X2、添加Animated Image 图片% I! u; \; a. ]2 w# u
第一步:导入图片资源。按照下图所示添加。
# j. z3 h2 b+ H5 g- L5 w% [
9 l, U  B5 s! a1 O  u ISN(MGHH[0%~46D1RLJZCAA.png . a8 ?$ @2 ]& f$ {$ P
# [1 E/ v8 N& O6 _: t: Y; @
第二步:给Animated控件指定动态图片的起始图片、以及下一张图片显示时间。
# D/ w+ e, ]& Q. V* X* M这里设置没一帧间隔30ms。不同间隔显示速度不同,有兴趣可以自己尝试下。! m% x# y2 O0 b* s3 e. H; i' w

  V5 S- x3 S1 }- U0 Y }49K7L7[{}{8W1Y)9PVZ[)9.png
) d' }; }- w; b9 F, Y- A, X) R  p. c& Y9 H) c; U) _
3、添加按钮文本资源
/ H) x# O2 N5 p, ~3 g+ ^% j' I按照下图步骤依次更改,其中第5步 GB目录下面显示的是当选择ResourceID是分别对应的显示在Button上的字符。
1 ]/ q  L1 i2 F% m5 \( a, l5 s" _% w* j6 i
Z{YZ[4D}49Y]ZT0A7}H@3C9.png
, Q8 D: g( Y' r$ J/ ~3 f. ]8 Q5 U8 W1 x( G
4、添加交互
3 @4 F, a+ b: Q! q0 G! e1、给Button添加Interactions
5 {4 L+ q+ t3 Q, p1 \# M4 b2 o其中Actions选择Execute C++ Code,,表示单机这个Button执行下面的C++代码
2 Z& D' [) E, D0 V
& u, q# X+ g# Z- N% U B22F1UCV3T0I)0EJO9]OV[J.png 2 {( {  H. j) t$ `' E( s

% b/ g! r+ S# y- |$ r7 b; s5 R' BC++代码如下& l9 y2 E1 Q+ Y& _( Y0 Q# j2 r2 ^

. z' D4 E# @+ M  K/ u' v" }2 j' l; [
  1. if (animation.isAnimatedImageRunning())$ y4 ?9 [7 b" }! `
  2. {% }! p. X& J& z9 z5 t6 j
  3.     animation.pauseAnimation();//暂停动画
    * W9 r; f! c7 a) k
  4.     btn_start_stop.setLabelText(TypedText(T_START));//设置butto
    ' }" K  |' o5 C2 r" A* |
  5.                                                                                                     //的文本为start
    + M+ T) ]' Y1 T0 H9 r9 p
  6. }0 E1 O/ o6 P/ G+ X4 [' O- _3 z
  7. else
    & W2 F9 J) F* C2 O$ z0 @
  8. {/ k' ^5 J! N; c1 E0 P2 P' _+ }6 m
  9.         //开始动画
    - J$ ]7 N+ \; B* b& h( F) o- B
  10.     animation.startAnimation(animation.isReverse(), false, true);
    & I! }( i+ J# N( x1 \+ U' d
  11.    //设置button文本为stop
    - _5 k8 @( l% J# i/ y1 n
  12.     btn_start_stop.setLabelText(TypedText(T_STOP));: u' _. i/ h5 S! Z/ c+ S# ~
  13. }
    9 [% Z4 V) \) W5 [( X$ z( @: j

  14. $ A( ~7 C' ~: @9 r8 A
复制代码

: B" i3 Q& o6 u) ~4 z, [. i为animated image 添加interactions
' H9 u; R# l( B; f! F3 x2 ^% A
$ p  Q; j( [; Z0 `' n& L8 e %QX)~{%HEE25B6CUSOKW9.png 2 c9 |" F# k4 [6 S" j. c/ R
$ H5 t( N( V' H' L4 \5 \' |6 V
同样也要执行C++代码
& i& r( ^" E, j
1 T& U1 J. e/ F2 V
  1. //animation.isReverse() 判断是否是暂停状态0 d- e; m6 r" z. P% @& X7 Y7 H, L2 X
  2. animation.startAnimation(!animation.isReverse(), false, true);6 ~2 g) E3 x+ b( ?+ B$ _
复制代码
* M, H$ f& ^$ c
二、仿真运行" d/ W6 o' T, l( m8 P9 G4 l! H: i
MainViewBase.hpp 文件会生成两个回调函数:1 o- t7 {6 m  ^  m- ?" j
1、void buttonCallbackHandler(const touchgfx::AbstractButton& src);
( q& s2 q- Z7 ~& u9 i) b/ H) F3 i2、void animationEndedCallbackHandler(const touchgfx::AnimatedImage& src);
' d1 L7 [2 W# a" d其具体实现方法在MainViewBase.cpp。可以看到我们在touchGFX添加的C++代码自动生成到这两个回调函数中。- T* `4 Z4 N1 P& n$ R6 M

. G, W! e# N4 m; \. l' r9 @) h
  1. /*********************************************************************************/
    - b4 L* c) T; H7 Z, M* |" t, [
  2. /********** THIS FILE IS GENERATED BY TOUCHGFX DESIGNER, DO NOT MODIFY ***********/7 x3 W* J" N' S- I8 B
  3. /*********************************************************************************/
    & w4 g* X) S/ I4 [1 @0 x& M9 s( l
  4. #ifndef MAINVIEWBASE_HPP/ P8 p9 K2 P5 L5 f
  5. #define MAINVIEWBASE_HPP
    5 l) `5 n! v( ?
  6. ' e" C2 ?; q5 x
  7. #include <gui/common/FrontendApplication.hpp>
    3 W$ f3 l9 j' R3 j; q
  8. #include <mvp/View.hpp>: V7 U. r* T$ L0 A
  9. #include <gui/main_screen/MainPresenter.hpp>) t6 K" n2 T3 n0 P- g! n0 v
  10. #include <touchgfx/widgets/Box.hpp>
      b5 e1 R  l# T5 r, U6 v  p
  11. #include <touchgfx/widgets/Image.hpp>
    & k* F5 u5 ]: w- \/ a, t4 E; c
  12. #include <touchgfx/widgets/AnimatedImage.hpp>
    4 z4 k! u/ q, q) K9 A7 |  ?- p
  13. #include <touchgfx/widgets/ButtonWithLabel.hpp>9 X/ L" j0 [/ P; h* ?& H. z0 h
  14. + |; q1 _1 e% |* V0 G. M7 D
  15. class MainViewBase : public touchgfx::View<MainPresenter>- ]$ W: T4 g$ [
  16. {$ o: y% b; w1 A* Q
  17. public:  i. l9 w! {- D
  18.     MainViewBase();
    ! u5 s% Y7 o- H- d+ M/ D: x0 @
  19.     virtual ~MainViewBase() {}' B/ G8 W3 `2 M& [+ |
  20.     virtual void setupScreen();  M" X% F  x1 \! a

  21. 9 w" |3 X1 w" N
  22. protected:
    ' u7 Y$ c0 k# s- A2 B" n8 t  i
  23.     FrontendApplication& application() {# J* w2 j3 e) U7 o: o$ {
  24.         return *static_cast<FrontendApplication*>(touchgfx::Application::getInstance());" h& k; a5 a( [! o+ h' k
  25.     }2 Q1 D  Y" m- s- l) ?
  26. , |1 Y: H, h& I  [- K* G. j) g1 m! N
  27.     /*
    8 E) Q0 @# \, u$ ]1 `$ ]
  28.      * Member Declarations6 O, J; \3 y" t" I
  29.      */
    3 m" \0 ^2 C; q) w
  30.     touchgfx::Box __background;
    0 E! b5 e6 |4 ?' m/ e
  31.     touchgfx::Image background;0 U, v" b) b4 L
  32.     touchgfx::AnimatedImage animation;
    ) t$ l  \$ R" @4 L- {
  33.     touchgfx::ButtonWithLabel btn_start_stop;
    3 g# k* H2 m* ?" I& i
  34. * U% m" P) q8 b' ^8 ]* M1 V6 d
  35. private:/ ]5 ?7 h0 D! U; q4 B
  36.   t2 G: l  w, x, H
  37.     /*
    : _. p& k0 q7 A- S
  38.      * Callback Declarations
    * k& Z. D  h' F( s7 |8 j! E
  39.      *// {2 m( s: J7 u0 P* M+ m7 n
  40.     touchgfx::Callback<MainViewBase, const touchgfx::AbstractButton&> buttonCallback;, s9 B* C. K4 \; @/ i6 K# j. G
  41.     touchgfx::Callback<MainViewBase, const touchgfx::AnimatedImage&> animationEndedCallback;
    2 W5 H$ t- R, w! Q

  42. # C4 F* g( J/ m3 H
  43.     /*+ L* p. n+ O* K0 d5 a, p
  44.      * Callback Handler Declarations
    ' h: B& j5 x, f, H6 ~$ n% D
  45.      */
    # L1 `! `4 _+ J# I
  46.      //TouchGFX自动生成
    $ k/ {% ]' D: _7 O: B. r$ b
  47.     void buttonCallbackHandler(const touchgfx::AbstractButton& src);. M$ K; I5 u: a; H& |
  48.     void animationEndedCallbackHandler(const touchgfx::AnimatedImage& src);
    ( [8 ~2 T5 P9 ?( ^/ n; r
  49. $ ~0 d" u' [' R
  50. };
    # s+ m; b2 k4 }3 y! Z
  51. & g1 G3 a1 o% P" Q% b2 w$ F3 g
  52. #endif // MAINVIEWBASE_HPP
    ! @1 b* R" n/ M  E

  53. 7 G  ~2 m) ]: k$ R. S
复制代码
" R- J5 u* T; N# A- U$ }$ k; J2 f
如果不知道Animated Image有哪些方法和属性,可以在MainviewBase.hpp包含的头文件里找到引用的对应的头文件,右键打开即可找到Animated image的类文件,其中包含了Animated Image所有的方法和属性。
1 w+ n: _0 {! E7 a2 q2 e
2 P1 O3 E# Z$ ]! x) g$ w( Z$ C# {& t5 {+ Q# w5 ^  _2 ~
赞 收藏 评论0 发布时间:2022-3-11 21:57

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版