跳转到主要内容

动画存储

动画存储是由TouchGFX支持的可选额外帧缓存,用于在屏幕转换期间创建动画。
动画存储必须手动分配,并在启动时向TouchGFX注册。
通过幻灯片转换和快照控件使用动画存储, 也可作为通用位图使用。

设置动画存储

动画存储缓存的大小与普通帧缓存相同。 例如,您的显示器是16位480 x 272像素,则帧缓存为480 x 272 x 2=261,120字节。

动画存储要么通过数组分配,要么通过显式地址分配(不能在TouchGFX生成器中配置):

namespace
{
LOCATION_PRAGMA("TouchGFX_Framebuffer")
uint16_t animationBuffer[480 * 272] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Framebuffer");
}

此例中,我们创建了130,560个16位整数的数组。 这与本例中帧缓存的大小相匹配,并确保16位对齐。

我们通过调用HAL上的一个方法将缓存传递给TouchGFX:

TouchGFXHAL.cpp
void TouchGFXHAL::initialize()
{
TouchGFXGeneratedHAL::initialize();
setAnimationStorage((void*)animationBuffer); // Add animation storage
}

建议在调用TouchGFXGeneratedHAL::initialize之后调用HAL::setAnimationStorage,因为生成的代码会清除动画存储地址。

幻灯片转换

After allocating and registering an Animation Storage buffer we can now use the Slide Transition in TouchGFX Designer.
This is done by creating an interaction on the Screen where the transition begins:

用幻灯片转换变更屏幕

在上例中,一个应用程序有两个屏幕;Screen1和Screen2。 Screen1上有一个标签按钮控件,我们希望按下按钮时,应用程序变更为Screen2。
可通过点击右上角的“交互”并按照图片所示配置交互来实现。

当幻灯片转换开始时,TouchGFX会将当前帧缓存(显示Screen1)复制到动画存储。 随后TouchGFX更改为Screen2,但将动画存储中的像素复制到帧缓存(不显示Screen2中的任何像素)。 在每一帧中,随着转换的进行,动画存储的像素会越来越向左显示(显示的像素越来越少),Screen2中的像素则从右侧进入:

幻灯片转换,左侧显示动画存储中的像素,右侧显示Screen2

In the configuration of the interaction in TouchGFX Designer it is possible to select the direction of the slide.

将动画存储与快照控件一起使用

快照控件可将数据从帧缓存复制到动画存储:

class Screen1View : public Screen1ViewBase
{
public:
...
void copyFrameBuffer();
protected:
SnapshotWidget snapshot; ///< The SnapshotWidget that is moved when transitioning.
};

void Screen1View::copyFrameBuffer()
{
snapshot.setPosition(0, 0, HAL::DISPLAY_WIDTH, HAL::DISPLAY_HEIGHT);
snapshot.makeSnapshot(); // Copy whole frame buffer to Animation Storage
}

copyFrameBuffer方法使用快照控件将帧缓存复制到动画存储。

如果控件在屏幕中保持可见,则快照控件将显示动画存储的内容。 如果不想显示,请将其设置为不可见:

    snapshot.setVisible(false);

动画存储与图像一起使用

动画存储可作为任何普通位图使用。 其BitmapId为BITMAP ANIMATION STORAGE = 0xFFFE。 要将其与图像控件一起使用,您可以:

    image1.setBitmap(Bitmap(BITMAP_ANIMATION_STORAGE));

动画存储位图的尺寸始终为帧缓存尺寸。

动画存储可采用这种方式用于许多使用位图的控件,例如:纹理映射器。