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

STM32 TouchGFX经验分享(六)

[复制链接]
STMCU小助手 发布时间:2023-3-5 12:01
圆环型进度条
好久没更新了,之间主要是为了之后的更新在准备一些demo,这期主要给大家介绍一个例子,这个例子很小但是能说明 一些TouchGFX的开发细节。话不多说先上图。

20200709102506640.png

这期主要给大家介绍这个圆环进度条。

制作原理
这个 看起来感觉很高大上的进度条,其实组成原理分为几个部分。
首先先注意下这个界面,这个界面是touchGFX官方提供的demo中的一个画面,其中左侧的滑动栏主要作用是用于切换右侧的界面,这里我们不过多讲解。再看下整体通过touchGFX搭建的界面。

20200709103212408.png

这个界面上并没有圆环的内容,但是右侧有一个底图背景background,这个image定义了界面的主色调,这样开发这个控件时主要的大背景颜色也应该类似,如果跳脱了那就只能说明丑!!!
既然控件不是通过designer去实现的,那只能说明该部分的内容可变动的地方过于多。所以需要通过代码实现,下面我们想一下这个控件的制作过程。
首先在touchGFX中制作控件需要有一个类Container,这个类之前提过这里就不过多说明了。重载这个类后需要一个背景图片,还需要一个前景图片,这两个图片的色调要和大背景相互吻合。
20200709104355318.png

背景图

20200709104355317.png

前景图
除此之外,也需要圆环的部分,第一圆环需要根据百分比的数值进行变动,第二也可以通过手动进行滑动,如果用图片制作那么会加大繁琐程度也不会有太好的效果。这里我们想到touchgfx官方提供的画圆的工具Circle类,这个类继承的是画图及画布的部分,这样就需要一个画出色彩斑斓的画笔去画圆。 那这个画笔的颜色如下图


20200709105023716.png

通过这个画笔则可以制作出相应的圆环。
到这里总结下之前的思路,首先需要两个图片一个做前景一个做背景,还有需要一个圆环,一个画笔,其余就是需要滑动事件,及控件窗口。
到这里有人会问,这么简单就制作一个控件吗,其实大多数控件都可以分解为简单的部分。通过简单的搭建可以做出复杂的效果,千里之行始于足下嘛。下面看下制作流程吧。


制作流程
首先创建个控件类。
  1. class CircularProgress : public Container
  2. {

  3. }
复制代码

在类中添加内容
  1. class CircularProgress : public Container
  2. {
  3. public:

  4.     CircularProgress();

  5.     virtual ~CircularProgress();

  6.     int getValue()
  7.     {
  8.         return currentPercentage;
  9.     }

  10.     void setBarAngle(int angleInDegrees);

  11.     virtual void handleClickEvent(const ClickEvent& evt);
  12.     virtual void handleDragEvent(const DragEvent& evt);

  13. protected:
  14.     static const int END_DEGREE = 116;
  15.     static const int START_DEGREE = -END_DEGREE;

  16.     Image background; 背景
  17.     Image centerImage; 前景

  18.     Circle bar; 圆环
  19. #if !defined(USE_BPP) || USE_BPP==16
  20.     PainterRGB565Bitmap bitmapPainter; 画笔
  21.     PainterRGB565 colorPainter;
  22. #elif USE_BPP==24
  23.     PainterRGB888Bitmap bitmapPainter;
  24.     PainterRGB888 colorPainter;
  25. #elif defined(LCD8BPP_ABGR2222)
  26.     PainterABGR2222Bitmap bitmapPainter;
  27.     PainterABGR2222 colorPainter;
  28. #elif defined(LCD8BPP_RGBA2222)
  29.     PainterRGBA2222Bitmap bitmapPainter;
  30.     PainterRGBA2222 colorPainter;
  31. #elif defined(LCD8BPP_BGRA2222)
  32.     PainterBGRA2222Bitmap bitmapPainter;
  33.     PainterBGRA2222 colorPainter;
  34. #elif defined(LCD8BPP_ARGB2222) || USE_BPP==8
  35.     PainterARGB2222Bitmap bitmapPainter;
  36.     PainterARGB2222 colorPainter;
  37. #elif USE_BPP==4
  38.     PainterGRAY4Bitmap bitmapPainter;
  39.     PainterGRAY4 colorPainter;
  40. #elif USE_BPP==2
  41.     PainterGRAY2Bitmap bitmapPainter;
  42.     PainterGRAY2 colorPainter;
  43. #else
  44. #error Unknown USE_BPP
  45. #endif

  46.     TextAreaWithOneWildcard percentageText;
  47.     Unicode::UnicodeChar percentageTextBuffer[5];

  48.     TextArea headlineText;//文字

  49.     int currentPercentage;

  50.     void updateBar(int newX, int newY); 位置
  51. };
复制代码

之后看一下整体的组合。
  1. CircularProgress::CircularProgress()
  2. {
  3.     setTouchable(true);

  4.     background.setBitmap(Bitmap(BITMAP_CONTROLS_WHEEL_BACKGROUND_ID));
  5.     background.setXY(0, 0);
  6.     add(background);放背景

  7.     centerImage.setBitmap(Bitmap(BITMAP_CONTROL_CENTER_BUTTON_ID));
  8.     centerImage.setXY(background.getX() + (background.getWidth() - centerImage.getWidth()) / 2, background.getY() + (background.getHeight() - centerImage.getHeight()) / 2);
  9.     add(centerImage);放前景

  10.     bitmapPainter.setBitmap(Bitmap(BITMAP_CONTROL_COLOR_WHEEL_ID)); 设置画笔的图片
  11.     colorPainter.setColor(Color::getColorFrom24BitRGB(0x11, 0x2C, 0x3C), 70);

  12.     int radius = 103;
  13. 设置圆环的参数还有画笔
  14.     bar.setPosition(background.getX(), background.getY(), background.getWidth(), background.getHeight());
  15.     bar.setCenter(bar.getWidth() / 2.0f, bar.getHeight() / 2.0f);
  16.     bar.setRadius(radius);
  17.     bar.setLineWidth(25);
  18.     bar.setPainter(bitmapPainter);
  19.     bar.setCapPrecision(15);
  20.     bar.setArc(START_DEGREE, 0);
  21.     add(bar);
  22. 设置中间显示的文字
  23.     Unicode::snprintf(percentageTextBuffer, 5, "%d", 100);
  24.     percentageText.setWildcard(percentageTextBuffer);
  25.     percentageText.setTypedText(TypedText(T_PERCENTAGE_BAR_READOUT));
  26.     percentageText.setXY(background.getX() + (background.getWidth() - percentageText.getWidth()) / 2, background.getY() + (background.getHeight() - percentageText.getHeight()) / 2 - 20);
  27.     percentageText.setColor(Color::getColorFrom24BitRGB(0xFF, 0xFF, 0xFF));
  28.     add(percentageText);

  29.     headlineText.setTypedText(TypedText(T_PERCENTAGE_BAR_HEADLINE));
  30.     headlineText.setXY(background.getX() + (background.getWidth() - headlineText.getWidth()) / 2, percentageText.getY() + 60);
  31.     headlineText.setColor(Color::getColorFrom24BitRGB(0x17, 0x3C, 0x51));
  32.     add(headlineText);

  33.     setWidth(background.getWidth());
  34.     setHeight(background.getHeight());
  35. }
复制代码

修改角度的代码
  1. void CircularProgress::setBarAngle(int angleInDegrees)
  2. {
  3.     bar.updateArcEnd((int)angleInDegrees);

  4.     currentPercentage = (int)(100.0f * (angleInDegrees + END_DEGREE) / (END_DEGREE - START_DEGREE));
  5.     Unicode::snprintf(percentageTextBuffer, 5, "%d", currentPercentage);
  6.     percentageText.invalidate();
  7. }
复制代码

到这里一个控件就展示完了,之后给大家展示下这个控件的使用。
  1.     percentageBar.setXY(background.getX() + (background.getWidth() - percentageBar.getWidth()) / 2, background.getY() + (background.getHeight() - percentageBar.getHeight()) / 2);
  2.     percentageBar.setBarAngle(100);
  3.     percentageBar.setVisible(false);
  4.     add(percentageBar); //圆环
复制代码

————————————————
版权声明:空闲的程序员


点评

我想做一个垂直方向的进度条,该怎么做呢?  发表于 2025-7-24 18:13
收藏 评论1 发布时间:2023-3-5 12:01

举报

1个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版