滑动列表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
. 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( {- void Screen1View::scrollListUpdateItem(CustomContainer& item, int16_t itemIndex)/ d( D5 I/ I# k# _7 {3 J4 b
- {3 x) q" M8 j7 _/ K, R. c/ I
- item.setValue(itemIndex);0 g2 `8 H2 H# a$ b4 |5 {. r
- }/ 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
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
- class ScreenViewBase : public touchgfx::View
5 Z, T: t* n! I% P. T2 L) q - {1 M- }; ^7 P4 y6 b2 P3 S! _
- public:
& S1 [7 s' B$ m; U' `! h+ O - ScreenViewBase();5 s9 z* G8 c% G- T( G
- virtual ~ScreenViewBase() {}2 {3 l" N0 V4 j" f- `0 L- M
- virtual void setupScreen();+ e/ D2 J7 o- Q# U5 i0 a0 B/ P1 L
3 L- ~$ q V) _7 |- virtual void scrollListUpdateItem(CustomContainer& item, int16_t itemIndex)
/ k! H' r- ~, e; ~ - {
( _( u8 |6 d2 d! ^# L - // Override and implement this function in Screen3 g. s: [2 U* }3 ~4 @
- }
: m" o! y# y3 P - 7 P* l0 J8 c8 C" Q% G
- protected:2 r; v X7 r- l2 y+ H" @8 a, e7 x. B
- FrontendApplication& application() {
8 |; n) s$ J. H0 T) k( I: H - return *static_cast<FrontendApplication*>(Application::getInstance());
6 V. h* p1 u$ W' j$ l! w; r - }9 z# b% y! G" c: A8 q0 [3 B9 c
- touchgfx::BoxWithBorder boxWithBorder;
- v/ v: H- n' G/ m" P3 U+ o- } - touchgfx::ScrollList scrollList;- ]% h/ ?# i4 z- T
- //这里有个有意思的地方,大家可以带着疑问看下面的base.cpp文件! T0 G/ L' S* Q" D" s* @
- touchgfx::DrawableListItems<CustomContainer, 7> scrollListListItems;3 I6 `) x- h' O" S+ _
- private:, `: c' t9 r8 C6 p5 ^: W2 N
- void updateItemCallbackHandler(DrawableListItemsInterface* items, int16_t containerIndex, int16_t itemIndex);
; y' Q/ l( w0 }. G6 V$ M+ _ - touchgfx::Callback<ScreenViewBase, DrawableListItemsInterface*, int16_t, int16_t> updateItemCallback;
: f6 W# k9 u( y$ c" B - };8 E% o r/ S7 r# Y! p
复制代码- #include <gui_generated/screen1_screen/Screen1ViewBase.hpp>
' a* p# ?' X8 y - #include "BitmapDatabase.hpp"
* M9 D0 s6 u8 `/ U+ u
% k9 G: S ]' F, T- ^' d- Screen1ViewBase::Screen1ViewBase() :( D2 C& c+ _- [" s: A5 l" H
- updateItemCallback(this, &Screen1ViewBase::updateItemCallbackHandler)7 R% U1 O0 M3 ?2 [# E
- {
3 i) ~( x: M9 D4 x: r - //这里主要是创建一个scrollList需要配置的地方。
9 g) Z! f* t, |% H# }3 f F8 D - scrollList.setPosition(140, 10, 200, 252);4 u- A4 b7 v7 L
- scrollList.setHorizontal(false);$ H8 S! C v- g7 j, ?
- scrollList.setCircular(false);
" _# w Y+ W. R% N. q$ }' m - scrollList.setEasingEquation(touchgfx::EasingEquations::backEaseOut);% U W- V3 ~, H% h
- scrollList.setSwipeAcceleration(10);4 o8 D. }* Q. G4 `# q
- scrollList.setDragAcceleration(10);
! n- d7 N4 G. |6 b' L( `+ A - scrollList.setNumberOfItems(15);//这里造的item是二十个,还记的上面的DrawableListItems<CustomContainer, 7>吗,为什么造了二十个却只画7个。
3 f: y) m9 `& _" N2 U$ x2 r$ C5 o - scrollList.setPadding(0, 0);
+ Q0 E# b% W5 R1 g) y0 a1 w8 v, B - scrollList.setSnapping(false);7 U' o- ^' V8 r2 o. X# }- A8 W
- scrollList.setDrawableSize(50, 2);
# s0 g" g/ `! ^' A - scrollList.setDrawables(scrollListListItems, updateItemCallback);
5 v. f; h3 J* y4 H, o
3 e4 c4 X+ f! q( K( q- add(scrollList);- j6 S, o% \- i$ j2 B+ i! V/ g
- }# |' I1 S- A3 r0 |1 b
- 0 j" u+ _! s' p( L+ H
- void Screen1ViewBase::setupScreen()/ y& F5 v( E7 Y) r/ `+ K& R
- {
' r9 E+ o. N2 S9 y8 u b' K8 ~ - scrollList.initialize();$ b5 r, a! ?" W2 w; ~
- for (int i = 0; i < scrollListListItems.getNumberOfDrawables(); i++), x" M% l7 e4 L X0 m6 H& B
- {
4 ]/ m( u+ s9 H" A/ ]- { o' U - scrollListListItems[i].initialize();
0 @6 S; i9 V( G; W/ y. U - }
- U5 ^9 ?; W; x* E1 E - }/ M/ s6 Y% e V/ \% ~ b7 _
- ' \4 A) a$ a1 z# j* z9 q
- void Screen1ViewBase::updateItemCallbackHandler(touchgfx::DrawableListItemsInterface* items, int16_t containerIndex, int16_t itemIndex)
6 S4 L0 B% s8 A - {1 L6 U, ?9 I7 ]0 {/ j0 B
- if (items == &scrollListListItems)" n3 `4 c& k9 w2 W. L$ \3 L6 ?
- {
Y+ w. U3 f4 D% q1 a6 ` - touchgfx::Drawable* d = items->getDrawable(containerIndex);
1 \/ i6 B) K) s- @; J6 b - TextContainer* cc = (TextContainer*)d;
- W& E" M& c/ d5 z - scrollListUpdateItem(*cc, itemIndex);
$ b. I' s) @+ z- Y% t - }% ~2 @7 [* T8 |& V! k. A: l u4 t+ P* n$ ~
- }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 `
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
+ 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 ? |