动画存储
动画存储是由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,因为生成的代码会清除动画存储地址。
幻灯片转换
分配并注册动画存储缓存后,便可在TouchGFX设计器中使用幻灯片转换。
为此,可以在转换开始时的屏幕上创建一个交互:
在上例中,一个应用程序有两个屏幕;Screen1和Screen2。 Screen1上有一个标签按钮控件,我们希望按下按钮时,应用程序变更为Screen2。
可通过点击右上角的“交互”并按照图片所示配置交互来实现。
当幻灯片转换开始时,TouchGFX会将当前帧缓存(显示Screen1)复制到动画存储。 随后TouchGFX更改为Screen2,但将动画存储中的像素复制到帧缓存(不显示Screen2中的任何像素)。 在每一帧中,随着转换的进行,动画存储的像素会越来越向左显示(显示的像素越来越少),Screen2中的像素则从右侧进入:
在TouchGFX设计器的交互配置中,可选择幻灯片方向。
将动画存储与快照控件一起使用
快照控件可将数据从帧缓存复制到动画存储:
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));
动画存储位图的尺寸始终为帧缓存尺寸。
动画存储可采用这种方式用于许多使用位图的控件,例如:纹理映射器。