跳轉到主要內容

動畫儲存空間

動畫儲存空間是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,這樣產生的程式碼就會清除動畫儲存空間位址。

投影片轉換

配置並註冊動畫儲存空間緩衝區後,我們現在可以在TouchGFX Designer中使用投影片轉換功能了。
只要在轉換的畫面上建立互動即可:

使用投影片轉換變更畫面

在上例中,我們的應用程式已經有兩個畫面:Screen1和Screen2。 在Screen1上有ButtonWithLabel小工具,我們希望按下按鈕時,應用能夠變更為Screen2。
點擊右上角的「互動」,並如圖像所示設定互動,即可完成此操作。

開始投影片轉換時,TouchGFX會將目前的影像緩衝區(顯示Screen1)複製到動畫儲存空間。 然後,TouchGFX會變更至Screen2,但會將動畫儲存空間的像素複製到影像緩衝區(不會顯示Screen2的任何像素)。 隨著切換進行,在每一個畫面中,動畫儲存空間的像素會越來越向左顯示(顯示的像素越來越少),而Screen2的像素會從右側進入:

投影片轉換在左側顯示動畫儲存空間的像素,Screen2的像素則在右側顯示

在TouchGFX Designer的互動設定中,可以選擇投影片的方向。

使用動畫儲存空間與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));

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

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