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

STM32 TouchGFX经验分享(七)

[复制链接]
STMCU小助手 发布时间:2023-3-4 20:00
滑动列表2 o4 [! N6 s& A  u" M$ L
在TouchGFX上滑动列表有三种实现方式,scrollList和scrollWheel这两个实现方式在官方Demo中会有简单的使用教程,对于ListLayout有单独的demo在TouchGFX Designer中,这里对于简单的实现我们不做过多的分析,主要是在scrollList滑动列表基础上再加入其他的按钮进行分析一下。如果大家对于其他的类想了解的话可以参照官方给的API文档,这三种类在TouchGFX上显示的大同小异。
" {0 z' \: d" Q; {7 j* ], T* j  E3 B; c2 n/ C6 r
滑动列表基本用法
* g1 e3 k9 v3 I* D$ y& n- [scrollList 的属性及介绍
8 |  u8 @% z9 a, _$ U! y, |- u. T+ A: I) e/ c5 t. Y
R897(ZK(J`739EKRH5AHCR6.png
. G) a- q% H3 V4 E3 o8 t9 _

2 [8 C7 d+ i* a7 s1 ZscrollList 的成员函数及介绍( E7 e. P2 h, l1 A! N0 a" {
改列表除了有TouchGFX自带的函数外还存在这一些它独有的函数,接下来给大家一一介绍。# ], S/ r% w/ t! m, F3 h
scrollListUpdateItem(CustomContainer1& item, int16_t itemIndex)
+ O9 x* L5 |; ~2 W( C' R这个函数由于scrollList是个容器,当在容器中创建item的时候会触发这个函数机制,这个时候其中参数item代表当前更新的item,而itemIndex代表当前更新的序号。- t0 W: z8 m( `% Y2 c
我们现在每个item都是在容器中放置一个文本输入框,这时通过buffer更新文本内容。如下所示。
' J2 N2 F# M  l  c9 Y& E! s( {
  1. void Screen1View::scrollListUpdateItem(CustomContainer& item, int16_t itemIndex)/ d( D5 I/ I# k# _7 {3 J4 b
  2. {3 x) q" M8 j7 _/ K, R. c/ I
  3.     item.setValue(itemIndex);0 g2 `8 H2 H# a$ b4 |5 {. r
  4. }/ L6 N  J9 E& p6 x/ L
复制代码

- `; R( P$ `0 v% C) T) Y" B9 z7 N这时列表上会显示如下
4 x: R2 ?! u! u! H8 X( h
* K. j) L' b8 K# K+ C, _; J9 c
20200831183832274.gif
4 ?% L- D% W8 g$ Y: K& q3 X

3 a  A. F5 P9 B- k/ P5 ManimateToItem(int16_t itemIndex,int16_t animationSteps = -1)) P, @5 }' T3 I6 d, j; p# B; S
这个函数的作用是强行将中心位置移动到想要的item上,但是前提是需要知道item号。
$ y1 f- S5 D: e$ l: w9 b& O; n9 ]0 i, E- P* F8 b6 J

( x0 j' j% `1 @虽然是个容器,但是scrollList类也有点击事件的回调函数。+ _6 F1 D7 d# z. E, @
setItemSelectedCallback(GenericCallback< int16_t > & callback)
7 }6 n1 v8 i/ u6 M1 z+ k' @: h设置单击选定项目时将调用的回调。
: |" n- J3 B* Z9 W( f: zsetItemPressedCallback(GenericCallback< int16_t > & callback), x8 U( Q( e+ b, i) @. v# R, |5 X
设置在按下某个项目时将调用的回调。' [% M7 @# _4 _! `  ?
( c& U+ J0 f) P, @3 }+ f
8 B0 `- l6 D& D' M$ d, ]
说到这里终于要进入正题了。现在scrollList上面只有显示的文本没有按钮,例如checkbox button,如果加上button这时应该如何操作呢,接下来会给大家展示。+ O# \( @& T; V
+ W* d$ u' {0 h  ~: U# Q* R9 M

  @- Z* N: s5 Z8 A9 S滑动列表数据添加5 B9 Z" B9 x+ M! W( d8 m) K
在展示之前先看一下通过TouchGFX Designer自动生成的代码。; f( z) v1 r3 [6 Y4 B/ o
  1. class ScreenViewBase : public touchgfx::View
    5 Z, T: t* n! I% P. T2 L) q
  2. {1 M- }; ^7 P4 y6 b2 P3 S! _
  3. public:
    & S1 [7 s' B$ m; U' `! h+ O
  4.     ScreenViewBase();5 s9 z* G8 c% G- T( G
  5.     virtual ~ScreenViewBase() {}2 {3 l" N0 V4 j" f- `0 L- M
  6.     virtual void setupScreen();+ e/ D2 J7 o- Q# U5 i0 a0 B/ P1 L

  7. 3 L- ~$ q  V) _7 |
  8.     virtual void scrollListUpdateItem(CustomContainer& item, int16_t itemIndex)
    / k! H' r- ~, e; ~
  9.     {
    ( _( u8 |6 d2 d! ^# L
  10.         // Override and implement this function in Screen3 g. s: [2 U* }3 ~4 @
  11.     }
    : m" o! y# y3 P
  12. 7 P* l0 J8 c8 C" Q% G
  13. protected:2 r; v  X7 r- l2 y+ H" @8 a, e7 x. B
  14.     FrontendApplication& application() {
    8 |; n) s$ J. H0 T) k( I: H
  15.          return *static_cast<FrontendApplication*>(Application::getInstance());
    6 V. h* p1 u$ W' j$ l! w; r
  16.     }9 z# b% y! G" c: A8 q0 [3 B9 c
  17.     touchgfx::BoxWithBorder boxWithBorder;
    - v/ v: H- n' G/ m" P3 U+ o- }
  18.     touchgfx::ScrollList scrollList;- ]% h/ ?# i4 z- T
  19.     //这里有个有意思的地方,大家可以带着疑问看下面的base.cpp文件! T0 G/ L' S* Q" D" s* @
  20.     touchgfx::DrawableListItems<CustomContainer, 7> scrollListListItems;3 I6 `) x- h' O" S+ _
  21. private:, `: c' t9 r8 C6 p5 ^: W2 N
  22.     void updateItemCallbackHandler(DrawableListItemsInterface* items, int16_t containerIndex, int16_t itemIndex);
    ; y' Q/ l( w0 }. G6 V$ M+ _
  23.     touchgfx::Callback<ScreenViewBase, DrawableListItemsInterface*, int16_t, int16_t> updateItemCallback;
    : f6 W# k9 u( y$ c" B
  24. };8 E% o  r/ S7 r# Y! p
复制代码
  1. #include <gui_generated/screen1_screen/Screen1ViewBase.hpp>
    ' a* p# ?' X8 y
  2. #include "BitmapDatabase.hpp"
    * M9 D0 s6 u8 `/ U+ u

  3. % k9 G: S  ]' F, T- ^' d
  4. Screen1ViewBase::Screen1ViewBase() :( D2 C& c+ _- [" s: A5 l" H
  5.     updateItemCallback(this, &Screen1ViewBase::updateItemCallbackHandler)7 R% U1 O0 M3 ?2 [# E
  6. {
    3 i) ~( x: M9 D4 x: r
  7.         //这里主要是创建一个scrollList需要配置的地方。
    9 g) Z! f* t, |% H# }3 f  F8 D
  8.     scrollList.setPosition(140, 10, 200, 252);4 u- A4 b7 v7 L
  9.     scrollList.setHorizontal(false);$ H8 S! C  v- g7 j, ?
  10.     scrollList.setCircular(false);
    " _# w  Y+ W. R% N. q$ }' m
  11.     scrollList.setEasingEquation(touchgfx::EasingEquations::backEaseOut);% U  W- V3 ~, H% h
  12.     scrollList.setSwipeAcceleration(10);4 o8 D. }* Q. G4 `# q
  13.     scrollList.setDragAcceleration(10);
    ! n- d7 N4 G. |6 b' L( `+ A
  14.     scrollList.setNumberOfItems(15);//这里造的item是二十个,还记的上面的DrawableListItems<CustomContainer, 7>吗,为什么造了二十个却只画7个。
    3 f: y) m9 `& _" N2 U$ x2 r$ C5 o
  15.     scrollList.setPadding(0, 0);
    + Q0 E# b% W5 R1 g) y0 a1 w8 v, B
  16.     scrollList.setSnapping(false);7 U' o- ^' V8 r2 o. X# }- A8 W
  17.     scrollList.setDrawableSize(50, 2);
    # s0 g" g/ `! ^' A
  18.     scrollList.setDrawables(scrollListListItems, updateItemCallback);
    5 v. f; h3 J* y4 H, o

  19. 3 e4 c4 X+ f! q( K( q
  20.     add(scrollList);- j6 S, o% \- i$ j2 B+ i! V/ g
  21. }# |' I1 S- A3 r0 |1 b
  22. 0 j" u+ _! s' p( L+ H
  23. void Screen1ViewBase::setupScreen()/ y& F5 v( E7 Y) r/ `+ K& R
  24. {
    ' r9 E+ o. N2 S9 y8 u  b' K8 ~
  25.     scrollList.initialize();$ b5 r, a! ?" W2 w; ~
  26.     for (int i = 0; i < scrollListListItems.getNumberOfDrawables(); i++), x" M% l7 e4 L  X0 m6 H& B
  27.     {
    4 ]/ m( u+ s9 H" A/ ]- {  o' U
  28.         scrollListListItems[i].initialize();
    0 @6 S; i9 V( G; W/ y. U
  29.     }
    - U5 ^9 ?; W; x* E1 E
  30. }/ M/ s6 Y% e  V/ \% ~  b7 _
  31. ' \4 A) a$ a1 z# j* z9 q
  32. void Screen1ViewBase::updateItemCallbackHandler(touchgfx::DrawableListItemsInterface* items, int16_t containerIndex, int16_t itemIndex)
    6 S4 L0 B% s8 A
  33. {1 L6 U, ?9 I7 ]0 {/ j0 B
  34.     if (items == &scrollListListItems)" n3 `4 c& k9 w2 W. L$ \3 L6 ?
  35.     {
      Y+ w. U3 f4 D% q1 a6 `
  36.         touchgfx::Drawable* d = items->getDrawable(containerIndex);
    1 \/ i6 B) K) s- @; J6 b
  37.         TextContainer* cc = (TextContainer*)d;
    - W& E" M& c/ d5 z
  38.         scrollListUpdateItem(*cc, itemIndex);
    $ b. I' s) @+ z- Y% t
  39.     }% ~2 @7 [* T8 |& V! k. A: l  u4 t+ P* n$ ~
  40. }1 q. I( e6 a8 s3 j8 g
复制代码

& Q! R9 f) q1 D对于touchgfx来说scrollList是动态分配的item,也就是说现在显示几个就单独画几个,所以说窗口大小只能显示6个所以将反复的画其中的前六个。* d' k" w$ w' s. y3 c4 Z/ u
为了展示这个地方我在每个item上加入了checkbox button。接下来会看见神奇的地方。. G  }# q; M5 T" w9 O# D

( k) l( F8 w1 A5 f3 `
20200831190612546.png
4 o) b- c  Q, c6 ^$ O

) [" v' x+ _# r! P1 [  o这里手动修改了第0个和第一个的开关状态
; J5 r: @7 T3 e
1 r4 N4 C! k0 f8 S; z/ s
20200831190451880.png + o  X5 I: L* w2 `% n+ i% c

- u( Q. d5 u3 P2 q2 u# P9 n但是第7个和第8个也同时跟随变化,因为我的窗口在创建scrollList时,可以创建7个,刚好是0-6,但是第7个是重复了第0个的checkbox button的状态,以此类推则出现了以下现象。这时有人就要问了,那前方的文字为什么不是0-6的循环显示呢?接下来会给大家答案。) k1 R( d9 ^5 v  B# ?6 T. z

& F! X- u$ H  x/ B/ y  l; E1 i
' V! J7 E/ U+ [9 s
滑动列表数据更新
' F3 V+ d  R  O: _9 E& J还记得scrollListUpdateItem函数吗,我们在这个函数中写了更新,每次新载入一个item将会调用该函数,虽然item的动态创建一直是前6个,但是创建一个后调用scrollListUpdateItem时会强行将其中的文字修改为需要的内容。如果在上方的Demo中添加一个if(itemIndex<7)则大家就会看见想要的结果了。  V6 p& X9 x$ u( C8 r1 s. d
到这里也就是说checkbox button想要保持你所点击的状态,那么大家就需要一个数组进行维护这些item的状态。所以如果大家需要的是一个复杂的item列表这里不给大家推荐这个item,如果只是一个图片查看器之类的list用这个scrollList还是可行的。复杂的item推荐大家使用listLayout这个容器进行开发。
4 b- V  A* E1 q3 O) X3 Q5 r
0 a8 A8 z0 D- e2 X
* }2 Y! W- \# b$ Y
总结
# p3 `5 A- F) ^4 a: J# g3 l8 ]* [这里给大家展示了scrollList,虽然有些短板,但是对于MCU的GUI开发还是比较好用的,在touchGFX上如果需要简单的使用,那么这个scrollList还是可以满足大家的,这里可以看出除了这个控件外,其实TouchGFX最大的优势是可以自己组装出复杂的控件。对比于高级语言的GUI工具来说还是比较有代表性的一种ui搭建模式。; y6 |& u  ~+ }( S7 H
————————————————
* E2 H' h7 E( r, B) I版权声明:空闲的程序员' A+ v* m, P' X+ \. \8 v

# }3 k5 N6 Z( Y. {0 ?
赞 收藏 评论0 发布时间:2023-3-4 20:00

举报

0个回答

所属标签

相似技术帖

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