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

STM32 TouchGFX经验分享(九)

[复制链接]
STMCU小助手 发布时间:2023-3-5 11:50
动画
" o/ `& q. S0 {" C, W( K1 n1 S. f对于TouchGFX来说,动画的类型比较简单,但正是简单的动画方式才可以多重组合,形成复杂的动画效果。TouchGFX动画主要有位置移动、透明度转化、图片轮播、以及3D场景动画。接下来为大家介绍每种动画的特点及使用方法。
9 b  F# Y4 C: X
! Y. \/ H6 V7 B5 e% E; N
动画类型
! }0 y( R7 {/ r2 r位置移动:

6 o3 x& B$ d! `3 L, H9 H! AMoveAnimator类 用于移动控件的类,要使用该动画时在Box小部件上的TouchGFX Designer中启用Move Animator混合。在代码上启动该种动画的方法如下:
" _; c. a6 \' F) E$ n% G; ^; O
  1. scalableImage1.startMoveAnimation(136,100,100);
    0 o8 `% U% }" r
复制代码

" ?5 A7 z+ V3 Y! Z: C6 f" q8 O9 H同时也可以设置一个动画结束时的回调函数,如下所示:" d5 s- J+ D" E: j4 u" r) I/ E3 }) `
  1. class Screen1View : public Screen1ViewBase
    1 e4 _% T- T5 }* m" {) L4 I
  2. {# a1 F. x0 ^# V. k* f2 R6 B' s
  3. public:
    , K3 G0 i& q; R- Y% K
  4.     Screen1View();* P$ a! `, j  q9 \
  5.     // Declaring callback handler for move animation ended on a Box
    4 r. B5 ~! Z9 t% i. C6 ^
  6.     void boxMoveAnimationEndedHandler(const touchgfx::MoveAnimator<Box>& comp);
    , ~# M/ @" u$ R3 |
  7. 5 J# b; l/ C) N% w" e3 `- P
  8. protected:8 B0 A6 o. l5 T& }2 ]  A+ U8 u
  9.     // Declaring callback type of MoveAnimator<Box>
    ( i3 ]# I: k/ I; q& j, @3 H1 E5 Y
  10.     Callback <Screen1View, const touchgfx::MoveAnimator<Box>&> boxMoveAnimationEndedCallback;
    ) t! D6 j9 U2 O( l- f7 _( s& X# c) H
  11. };8 x/ P$ _$ l$ V* w* T6 r+ k8 ?
复制代码
  1. Screen1View::Screen1View() :) n4 L. x. Z( f3 l+ ~2 ~3 Y3 @
  2.   // In constructor for callback, bind to this view object and bind which function to handle the event., k; _  z! Q( |9 i6 T! r
  3.   boxMoveAnimationEndedCallback(this, &Screen1View::boxMoveAnimationEndedHandler) { }( i/ m2 i, y# o! N
复制代码
  1. void Screen1View::setupScreen()
    7 P4 k& P- S; I  a7 x
  2. {7 K- `& A: W5 _
  3.   // Add the callback to box
    % m  p! i4 L5 T& j
  4.   box.setMoveAnimationEndedAction(boxMoveAnimationEndedCallback);( X- o1 a8 U# h( Y7 `# B7 `
  5. }5 @( F; ~. b7 M+ B5 l
复制代码

' t# b  h( e1 |' R. k5 |: k这种添加回调的方式在TouchGFX上使用的很多之后可以通过API查找应用。, L* D; \3 I: ^9 ]  z

1 I0 `% Y  |# X, v% q透明度转化:
2 a) k  o. J" E; KFadeAnimator类用于将控件的透明度进行调整,这个动画可以实现动态半透明效果,例如光照之类。6 l/ r# M& ~6 v0 n% U3 C* D* Q
使用方法如下:
  s6 p( {1 f( ^- s" Z6 K: d0 G; N
  1. m_Image.startFadeAnimation(255, 100);
    1 h4 \8 T" Z  Z
复制代码
( T: D# K2 _+ m/ m
当然FadeAnimator类也有回调函数,再此不做过多介绍。4 q& T+ D# d: k# U$ ~) s# {! j

9 G$ j- |5 {2 A( Z% j1 [
6 k+ E3 I& |1 o- H3 E/ t
图片轮播:
2 u5 X" E  r; n  {6 ?+ {! v8 rAnimatedImage类用于多张图片的轮播,该类也被封装成了一种小控件,在TouchGFX designer中能看见该类。该动画的属性有暂停以及开始停止。
4 u: X* D- ~2 M) j5 C+ x
  1. animatedImage.startAnimation(false, true, true);
      n- a" r9 F! ^% ]3 X7 T1 q
复制代码
5 V, a8 l7 O" g+ z) z
startAnimation函数参数说明如下:- c. _0 B' A- m7 T" H
virtual void startAnimation ( const bool rev ,3 `8 K  O0 N3 u% j
const bool reset =false,
# B. C0 M+ K: i+ Bconst bool loop =false
: C, K; F3 R$ p* z* n1 f) F  [)
6 N, n/ p/ l$ S8 V$ GStarts the animation with the given parameters for animation direction, normal or reverse, whether to restart the animation and finally if the animation should loop automatically upon completion.: M' v7 I0 P  b7 a, `
Parameters:
) e: n! l. Z2 A4 O5 X8 q8 ?2 erev Defines if the animation should be performed in reverse order.3 C/ _6 Z2 _; t$ B; `" k2 p" ]) S9 K
reset (Optional) Defines if the animation should reset and start from the first (or last if reverse order) bitmap.
7 E5 x1 u2 D) o1 T/ F2 M2 S6 Qloop (Optional) Defines if the animation should loop or do a single animation.9 q' \2 k! y& z% F/ Y7 r" l8 U/ D
- O! F0 k  Z& B; V8 z' v: V
3D场景动画:
2 [, e5 @- E9 M) ItextureMapper类可以用作3D场景的动作,但虽然叫做3D场景,并不是将图像立体化做处理,而是通过将图像变形来展示3D的状态。所以使用的还是CPU的计算。3 m5 @7 h  ^, i1 Z$ h1 F
对于该类的使用建议大家看看官方的API说明。
: _% E  @4 S% K4 E' [3 n

" i! a- d/ K; _2 n/ u动画延时和动画速度
0 ^" }5 o2 u( h; b% F有些动画在移动的过程中会有从起始点到结束点的时间,除此之外还有一定时间后开始动画的操作。
8 }+ u5 B2 b5 h/ p& j接下来要说一说这些操作。
! {0 j4 U# b; ]6 X/ kvoid startMoveAnimation ( int16_t endX ,
9 u) d4 `: W( g* Bint16_t endY ,
' P- m/ [2 N+ r) o  q% x) J9 B( ]uint16_t duration ,+ i6 p( q$ E+ i: Y
EasingEquation xProgressionEquation =&EasingEquations::linearEaseNone,9 N, v# e5 m" I" H( M
EasingEquation yProgressionEquation =&EasingEquations::linearEaseNone. R1 q' `1 [- I! L& m7 D* y' d
)
1 H2 g/ {; i3 u6 o% L6 f
将动画从当前位置开始移动到指定的结束位置。  G. B* F* t. K% P% s( u

% @% ?7 C, M- K: T7 P0 _" M
: y! h/ `5 n$ ^: V, V! w  D; a
动画过程中位置(X,Y)的展开由提供的EasingEquations描述。如果未给出缓和方程,则移动将线性执行。% b8 M# g* [1 ~/ l9 j- d

6 X0 h* u  I" G' R- a) M7 ~5 @7 ?; P

  u" @4 e3 `. X+ k9 N4 B参数:: h) q' ?. i/ x% K/ Q
endX 动画结束时的X位置。: Y% c* x0 u$ G5 O$ I
endY 动画结束时的Y位置。
3 V2 v* E8 z' _, M1 F* A; Kduration 动画的持续时间,以刻度为单位。
0 o3 V# e+ `$ v- u2 MxProgressionEquation (可选)描述动画期间X位置的发展的等式。默认值为EasingEquations :: linearEaseNone。
& c1 \) _9 i/ {8 d( E* I  l; z( ZyProgressionEquation (可选)描述动画期间Y位置的发展的等式。默认值为EasingEquations :: linearEaseNone。3 A3 z4 ^. g- p! O& }6 S

; p. x" x* n; _, o
, b* Y. a2 k% j: }* [; ?0 u9 F
这其中duration 是动画运动保持的时间,但是输入的参数并不是毫秒数或者秒数,而是TouchGFX的tick数。, ^# R/ J* U8 m
virtual void setMoveAnimationDelay ( uint16_t delay )
( j4 o& E1 K# r- n$ i9 y设置一定时间后进行移动动画。. s/ g* \* F$ O4 O% |

7 v& z$ \, t6 V- m% `5 `4 |. \Parameters:9 U% o7 A+ Q6 ~- g% q
delay 延时的tick数。
7 e1 ^, C  w% ]/ l* R3 _
6 a8 b" a* T3 E5 j( N
由此可以看出用于计算动画帧数及动作的的周期是根据系统的TouchGFX的tick周期决定的,也就是说影响动画卡顿的条件之一就是tick的周期。除此之外还有动画刷新幅度的大小。随着大小不一刷新的速度不一致。. C7 N# u0 Z& \% T$ b4 B8 R& Y$ H
在嵌入式板子中如果需要使用动画那就要根据主tick中的业务逻辑进行调整,保证每次tick运行时间接近,以防动画卡顿。8 L$ y1 f- Z" a5 M9 w
) B  O" ^2 t# q! G
3 h4 B6 D2 T1 _' I/ n' n2 B
总结; Y9 L# M/ V* C' q
用动画时可以多考虑组合动画来达到想要的目的。总的来说动画的使用是用于嵌入式UI开发的点缀,如果将动画看作卖点的化真的就是画蛇添足了。; o" N$ D, _+ k) H
————————————————5 E! l) ?; x( s  c2 t. W
版权声明:空闲的程序员! ~# F  o8 j4 `
. M( j" T! _) M1 S' W4 m1 \

; W/ w' W9 v. J% W
赞 收藏 评论0 发布时间:2023-3-5 11:50

举报

0个回答

所属标签

相似技术帖

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