首页 > 其他分享 >TouchGFX界面开发 | 图像控件应用示例

TouchGFX界面开发 | 图像控件应用示例

时间:2023-10-29 13:01:31浏览次数:35  
标签:控件 btnToggle 动画 示例 touchgfx TouchGFX animation 图像


图像控件应用示例

TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前,必须将其导入到项目中。TouchGFX Designer内置了五种类型的图像部件:

  • 固定图像:图像大小是由关联的图像文件定义的,不能在运行时改动。若要将图像显示为不同大小,需调整导入图像的大小
  • 缩放图像:能够绘制缩放版位图的控件。只需更改控件的宽度/高度即可调整图像大小。缩放的质量取决于使用的渲染算法,渲染算法可动态更改
  • 标题图像:显示平铺位图的简单控件。位图可与背景进行 Alpha 混合,并可包含透明区域
  • 动画图像:能够使用一系列共用同一标识符的图像从头至尾运行动画。能够在停止或暂停之前运行一次动画或循环运行动画
  • 纹理映射器:能够绘制转换后的图像,可以自由缩放并围绕可调原点旋转。视角印象也可通过应用虚拟相机来实现,其中视角的数量是可调的

本文以动画图像(animatedImage)为例,介绍TouchGFX图像控件的使用,将实现如下视频中的效果:

本文示例基于于STM32F429IGT6 + RGB (800 * 480)硬件平台,提前移植好了TouchGFX,并添加了触摸驱动。详细可参考 使用STM32CubeMX移植TouchGFX 和 添加触摸屏驱动 这两篇文章的介绍

一、TouchGFX Designer界面布局

打开Keil工程中,TouchGFX文件夹里的TouchGFX Designer软件

  • 添加图片资源

TouchGFX界面开发 | 图像控件应用示例_hg

  • 添加文本资源

TouchGFX界面开发 | 图像控件应用示例_hg_02

  • 添加背景图片、以及带标签的按钮,选择按钮标签的文本资源

TouchGFX界面开发 | 图像控件应用示例_1024程序员节_03

  • 添加动画图片,给Animated控件指定动态图片的起始图片、以及下一张图片显示时间。注意图片的命名规则

所用图像必须使用标识符,例如img_01.png、img_02.png、img_03.png、img_04.png、img_05.png、img_06.png、img_07.png等

TouchGFX界面开发 | 图像控件应用示例_hg_04

  • 给button添加交互动作,使按钮被点击时直接执行C++代码,实现动画开关以及切换相应文本
if (animation.isAnimatedImageRunning())
{
	animation.pauseAnimation(); //暂停动画
	btnToggle.setLabelText(TypedText(T_TEXTSTART));  //设置button的文本为start
}
else
{
	animation.startAnimation(animation.isReverse(), false, true); //开始动画
	btnToggle.setLabelText(TypedText(T_TEXTSTOP));  //设置button文本为stop 
}

TouchGFX界面开发 | 图像控件应用示例_控件_05

  • 给动画图像添加交互,使动画在结束后直接执行C++代码,实现动画再启动
//animation.isReverse() 判断是否是暂停状态
animation.startAnimation(!animation.isReverse(), false, true);

TouchGFX界面开发 | 图像控件应用示例_控件_06

  • 点击Generate Code生成TouchGFX代码

二、MKD-ARM Keil中添加用户代码

TouchGFX生成代码后,由于在TouchGFX Designer中添加交互动作时,选择的是直接执行C++代码,并已经输入了代码。因此在Keil中无需再添加代码,要执行的C++代码已经自动嵌入了TouchGFX自动生成的视图基类代码中

如下视图基类代码中,包含了如何创建动画图像,以及交互动作的C++函数

#include <gui_generated/main_screen/MainViewBase.hpp>
#include <touchgfx/Color.hpp>
#include "BitmapDatabase.hpp"
#include <texts/TextKeysAndLanguages.hpp>

MainViewBase::MainViewBase() :
    buttonCallback(this, &MainViewBase::buttonCallbackHandler),
    animationEndedCallback(this, &MainViewBase::animationEndedCallbackHandler)
{

    __background.setPosition(0, 0, 800, 480);
    __background.setColor(touchgfx::Color::getColorFrom24BitRGB(0, 0, 0));

    background.setBitmap(touchgfx::Bitmap(BITMAP_BG_ID));
    background.setPosition(0, 0, 800, 480);
    background.setScalingAlgorithm(touchgfx::ScalableImage::NEAREST_NEIGHBOR);

    btnToggle.setXY(335, 316);
    btnToggle.setBitmaps(touchgfx::Bitmap(BITMAP_BTN_ID), touchgfx::Bitmap(BITMAP_BTN_PRESSED_ID));
    btnToggle.setLabelText(touchgfx::TypedText(T_TEXTSTART));
    btnToggle.setLabelColor(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
    btnToggle.setLabelColorPressed(touchgfx::Color::getColorFrom24BitRGB(255, 0, 0));
    btnToggle.setAction(buttonCallback);

    animation.setXY(321, 118);
    animation.setBitmaps(BITMAP_ANI_01_ID, BITMAP_ANI_09_ID);
    animation.setUpdateTicksInterval(2);
    animation.setDoneAction(animationEndedCallback);

    add(__background);
    add(background);
    add(btnToggle);
    add(animation);
}

void MainViewBase::setupScreen()
{

}

void MainViewBase::buttonCallbackHandler(const touchgfx::AbstractButton& src)
{
    if (&src == &btnToggle)
    {
        //buttonClicked
        //When btnToggle clicked execute C++ code
        //Execute C++ code
        if(animation.isAnimatedImageRunning())
        {
            animation.pauseAnimation();//暂停动画
            btnToggle.setLabelText(TypedText(T_TEXTSTART));//设置butto的文本为start
        }
        else
        {
            //开始动画
            animation.startAnimation(animation.isReverse(), false, true);
            //设置button文本为stop 
            btnToggle.setLabelText(TypedText(T_TEXTSTOP));
        }
    }
}

void MainViewBase::animationEndedCallbackHandler(const touchgfx::AnimatedImage& src)
{
    if (&src == &animation)
    {
        //animationEnded
        //When animation animation ended execute C++ code
        //Execute C++ code
        animation.startAnimation(!animation.isReverse(), false, true);
    }
}

三、下载测试

编译无误后,下载到开发板中,点击按钮会开始或停止显示动画效果


标签:控件,btnToggle,动画,示例,touchgfx,TouchGFX,animation,图像
From: https://blog.51cto.com/u_15467009/8079979

相关文章

  • WPF 控件模板
    控件模板WPF的ControlTemplate是一种用于定义和自定义控件的外观和结构的模板,它可以完全替换控件的默认模板,实现个性化和复杂的效果。WPF的ControlTemplate有以下几个特点:ControlTemplate是一个XAML元素,它可以包含任何类型的UI元素,如布局、形状、图像、文本等,这些元素......
  • Python 中多态性的示例和类的继承多态性
    单词"多态"意味着"多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行。函数多态性一个示例是Python中的len()函数,它可以用于不同的对象。字符串对于字符串,len()返回字符的数量:示例x="HelloWorld!"print(len(x))元组......
  • Python 中多态性的示例和类的继承多态性
    单词"多态"意味着"多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行。函数多态性一个示例是Python中的len()函数,它可以用于不同的对象。字符串对于字符串,len()返回字符的数量:示例x="HelloWorld!"print(len(x))元组对......
  • delphi 运行时动态设置控件(类)属性值
    运行时动态设置控件(类)属性值代码运行时根据控件名称设置Alignment属性值usesSystem.Rtti;procedureTForm1.Button1Click(Sender:TObject);varvComponent:TComponent;vRttiCtx:TRttiContext;vRType:TRttiType;vProp:TRttiProperty;v:TValue;begin......
  • Google Test 示例代码
    TODO:全局环境和监听事件在运行过程中的顺序。https://gitee.com/boluanace/googletest/blob/master/googletest/test/googletest-listener-test.cc参考资料https://github.com/google/googletest/tree/main/googletest/test未完待续......未经作者授权,禁止转载THEEND......
  • iptables使用示例
    iptable的各种targetiptables的结构:iptables由上而下,由Tables,Chains,Rules组成。一、iptables的表tables与链chainsiptables有Filter,NAT,Mangle,Raw四种内建表:1.Filter表Filter是iptables的默认表,它有以下三种内建链(chains):INPUT链 –处理来自外部的数据。OUTPUT链 –处理......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控
    在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随......
  • Fabric.js 自定义控件
    本文简介带尬猴,我是德育处主任虽然Fabric.js提供的基础功能已经很丰富了,但有时难免需要定制一些需求。比如本文要讲的『自定义控件』。掌握创建自定义控件这个功能,能够创建更加精美和实用的图形应用程序,提高用户体验和用户满意度。尽管Fabric.js的文档很一般,但demo还挺......
  • Python 继承和子类示例:从 Person 到 Student 的演示
    继承允许我们定义一个类,该类继承另一个类的所有方法和属性。父类是被继承的类,也叫做基类。子类是从另一个类继承的类,也叫做派生类。创建一个父类任何类都可以成为父类,因此语法与创建任何其他类相同:示例,创建一个名为Person的类,具有firstname和lastname属性以及一个printna......
  • Python 继承和子类示例:从 Person 到 Student 的演示
    继承允许我们定义一个类,该类继承另一个类的所有方法和属性。父类是被继承的类,也叫做基类。子类是从另一个类继承的类,也叫做派生类。创建一个父类任何类都可以成为父类,因此语法与创建任何其他类相同:示例,创建一个名为Person的类,具有firstname和lastname属性以及一个printn......