跳轉到主要內容

動畫儲存空間

動畫儲存空間是TouchGFX支援的選用額外影像緩衝區,可用於在螢幕轉換期間建立動畫。
動畫儲存空間必須手動配置,並在啟動期間向TouchGFX註冊。
動畫儲存空間用於投影片切換功能和SnapshotWidget, 也可作為一般點陣圖使用。

設定動畫儲存空間

動畫儲存空間緩衝區的大小和一般影像緩衝區大小相同。 例如,如果您的顯示器是480 x 272像素並採用16位元顏色,則影像緩衝區就是480 x 272 x 2 = 261,120位元組。

動畫儲存空間是透過陣列或明確位址配置(無法在TouchGFX Generator中設定):

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上有ButtonWithLabel小工具,我們希望按下按鈕時,應用能夠變更為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.

使用動畫儲存空間與SnapshotWidget

SnapshotWidget可用於將資料從影像緩衝區複製到動畫儲存空間:

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(); // 將整個影像緩衝區複製到動畫儲存空間
}

copyFrameBuffer方法使用SnapshotWidget將影像緩衝區複製到動畫儲存空間。

若SnapshotWidget持續在畫面上可見,則將會顯示動畫儲存空間的內容。 若不希望其顯示,請將其設定為不可見:

    snapshot.setVisible(false);

使用動畫儲存空間與圖像

動畫儲存空間可作為一般點陣圖使用。 其BitmapId為BITMAP_ANIMATION_STORAGE = 0xFFFE。 若要將其與圖像小工具搭配使用,您可以:

    image1.setBitmap(Bitmap(BITMAP_ANIMATION_STORAGE));

動畫儲存空間點陣圖的尺寸一律與影像緩衝區的尺寸相同。

很多使用點陣圖的小工具(如紋理映射器)皆可透過這種方式使用動畫儲存空間。