Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Setiap kali aplikasi menjadwalkan papan cerita, aplikasi harus menyediakan waktu saat ini ke manajer animasi. Waktu saat ini juga diperlukan saat mengarahkan manajer animasi untuk memperbarui statusnya dan mengatur semua variabel animasi ke nilai terinterpolasi yang sesuai.
Ikhtisar
Ada dua konfigurasi yang didukung oleh Animasi Windows: animasi berbasis aplikasi dan animasi berbasis timer.
Untuk menggunakan animasi berbasis aplikasi di aplikasi Anda, Anda harus memperbarui manajer animasi sebelum menggambar setiap bingkai dan menggunakan mekanisme yang sesuai untuk menggambar bingkai yang cukup sering untuk animasi. Aplikasi yang menggunakan animasi berbasis aplikasi dapat menggunakan mekanisme apa pun untuk menentukan waktu saat ini, tetapi objek timer Animasi Windows mengembalikan waktu yang tepat dalam unit yang diterima oleh manajer animasi. Untuk menghindari gambar yang tidak perlu ketika tidak ada animasi yang diputar, Anda juga harus menyediakan pengelola penanganan aktivitas untuk mulai menggambar ulang ketika animasi dijadwalkan dan memeriksa setelah setiap bingkai apakah penggarapan ulang dapat ditangguhkan. Untuk informasi selengkapnya, lihat Application-Driven Animasi.
Dalam konfigurasi berbasis aplikasi, aplikasi dapat memanggil metode IUIAnimationManager::GetStatus untuk memverifikasi bahwa animasi saat ini dijadwalkan dan terus menggambar bingkai jika ya. Karena penjabaran ulang berhenti ketika tidak ada animasi yang dijadwalkan, perlu untuk memulai ulang saat animasi dijadwalkan berikutnya. Aplikasi dapat mendaftarkan penanganan aktivitas manajer untuk diberi tahu ketika status manajer animasi berubah dari menganggur (tidak ada animasi yang saat ini dijadwalkan) menjadi sibuk.
Untuk menggunakan animasi berbasis timer di aplikasi, Anda harus menyambungkan manajer animasi ke timer animasi dan menyediakan penanganan aktivitas timer. Ketika manajer animasi terhubung ke timer, timer dapat memberi tahu manajer kapan status animasi harus diperbarui saat waktu berlangsung. Aplikasi harus menggambar bingkai untuk setiap centang timer. Manajer animasi pada gilirannya dapat memberi tahu timer ketika ada animasi yang diputar, sehingga timer dapat mematikan dirinya sendiri selama periode diam ketika penguraian ulang tidak perlu. Untuk menghindari gambar yang tidak perlu ketika tidak ada animasi yang diputar, Anda harus mengonfigurasi timer untuk menonaktifkan dirinya secara otomatis. Untuk informasi selengkapnya, lihat Timer-Driven Animasi.
Contoh Kode
Animasi Application-Driven
Contoh kode berikut diambil dari ManagerEventHandler.h dari sampel Animasi Windows Application-Driven Animasi dan Tata Letak Kisi . Ini mendefinisikan pengelola penanganan aktivitas.
#include "UIAnimationHelper.h"
// Event handler object for manager status changes
class CManagerEventHandler :
public CUIAnimationManagerEventHandlerBase<CManagerEventHandler>
{
public:
static HRESULT
CreateInstance
(
CMainWindow *pMainWindow,
IUIAnimationManagerEventHandler **ppManagerEventHandler
) throw()
{
CManagerEventHandler *pManagerEventHandler;
HRESULT hr = CUIAnimationCallbackBase::CreateInstance(
ppManagerEventHandler,
&pManagerEventHandler
);
if (SUCCEEDED(hr))
{
pManagerEventHandler->m_pMainWindow = pMainWindow;
}
return hr;
}
// IUIAnimationManagerEventHandler
IFACEMETHODIMP
OnManagerStatusChanged
(
UI_ANIMATION_MANAGER_STATUS newStatus,
UI_ANIMATION_MANAGER_STATUS previousStatus
)
{
HRESULT hr = S_OK;
if (newStatus == UI_ANIMATION_MANAGER_BUSY)
{
hr = m_pMainWindow->Invalidate();
}
return hr;
}
...
};
Contoh kode berikut diambil dari MainWindow.cpp dari sampel Animasi Windows Application-Driven Animasi; lihat CMainWindow::InitializeAnimation. Contoh ini membuat instans penanganan aktivitas manajer menggunakan metodeCreateInstance dan meneruskannya ke manajer animasi menggunakan metodeIUIAnimationManager::SetManagerEventHandler.
// Create and set the ManagerEventHandler to start updating when animations are scheduled
IUIAnimationManagerEventHandler *pManagerEventHandler;
HRESULT hr = CManagerEventHandler::CreateInstance(
this,
&pManagerEventHandler
);
if (SUCCEEDED(hr))
{
hr = m_pAnimationManager->SetManagerEventHandler(
pManagerEventHandler
);
pManagerEventHandler->Release();
}
Karena pengelola penanganan aktivitas mempertahankan referensi ke objek jendela utama, pengelola penanganan aktivitas harus dibersihkan (dengan meneruskan NULL ke SetManagerEventHandler) atau manajer animasi harus sepenuhnya dirilis sebelum jendela utama dihancurkan.
Contoh kode berikut diambil dari MainWindow.cpp dalam sampel Animasi Windows Application-Driven Animasi; lihat metode CMainWindow::OnPaint. Ini memanggil metode IUIAnimationManager::GetTime untuk mengambil waktu dalam unit yang diperlukan oleh metode IUIAnimationManager::Update.
// Update the animation manager with the current time
UI_ANIMATION_SECONDS secondsNow;
HRESULT hr = m_pAnimationTimer->GetTime(
&secondsNow
);
if (SUCCEEDED(hr))
{
hr = m_pAnimationManager->Update(
secondsNow
);
...
}
Contoh kode berikut diambil dari MainWindow.cpp dari sampel Animasi Windows Application-Driven Animasi dan Tata Letak Kisi ; lihat metode CMainWindow::OnPaint. Ini mengasumsikan bahwa aplikasi menggunakan API grafis yang secara otomatis disinkronkan ke kecepatan refresh monitor (seperti Direct2D dengan pengaturan defaultnya), dalam hal ini panggilan ke fungsi InvalidateRect sudah cukup untuk memastikan bahwa kode lukisan akan dipanggil lagi ketika saatnya untuk menggambar bingkai berikutnya. Daripada memanggil InvalidateRect tanpa syarat, lebih baik memeriksa apakah masih ada animasi yang dijadwalkan menggunakan GetStatus.
// Read the values of the animation variables and draw the client area
hr = DrawClientArea();
if (SUCCEEDED(hr))
{
// Continue redrawing the client area as long as there are animations scheduled
UI_ANIMATION_MANAGER_STATUS status;
hr = m_pAnimationManager->GetStatus(
&status
);
if (SUCCEEDED(hr))
{
if (status == UI_ANIMATION_MANAGER_BUSY)
{
InvalidateRect(
m_hwnd,
NULL,
FALSE
);
}
}
}
Animasi Timer-Driven
Contoh kode berikut diambil dari TimerEventHandler.h dari sampel Animasi Windows Timer-Driven Animasi. Kode contoh mendefinisikan penanganan aktivitas pengatur waktu, yang membatalkan area klien jendela untuk menyebabkan pengecatan ulang setelah setiap pembaruan status animasi.
#include "UIAnimationHelper.h"
// Event handler object for timer events
class CTimerEventHandler :
public CUIAnimationTimerEventHandlerBase<CTimerEventHandler>
{
public:
static HRESULT
CreateInstance
(
CMainWindow *pMainWindow,
IUIAnimationTimerEventHandler **ppTimerEventHandler
) throw()
{
CTimerEventHandler *pTimerEventHandler;
HRESULT hr = CUIAnimationCallbackBase::CreateInstance(
ppTimerEventHandler,
&pTimerEventHandler
);
if (SUCCEEDED(hr))
{
pTimerEventHandler->m_pMainWindow = pMainWindow;
}
return hr;
}
// IUIAnimationTimerEventHandler
IFACEMETHODIMP
OnPreUpdate()
{
return S_OK;
}
IFACEMETHODIMP
OnPostUpdate()
{
HRESULT hr = m_pMainWindow->Invalidate();
return hr;
}
IFACEMETHODIMP
OnRenderingTooSlow
(
UINT32 /* fps */
)
{
return S_OK;
}
...
};
Contoh kode berikut diambil dari MainWindow.cpp dari sampel Animasi Windows Timer-Driven Animasi; lihat CMainWindow::InitializeAnimation. Contoh ini membuat instans penanganan aktivitas timer menggunakan metodeCreateInstance dan meneruskannya ke timer menggunakan metodeIUIAnimationTimer::SetTimerEventHandler. Karena penangan acara timer mempertahankan referensi ke objek jendela utama, penangan acara timer harus dihapus (dengan memberikan NULL ke SetTimerEventHandler) atau timer benar-benar dilepas sebelum jendela utama dihancurkan.
// Create and set the timer event handler
IUIAnimationTimerEventHandler *pTimerEventHandler;
hr = CTimerEventHandler::CreateInstance(
this,
&pTimerEventHandler
);
if (SUCCEEDED(hr))
{
hr = m_pAnimationTimer->SetTimerEventHandler(
pTimerEventHandler
);
pTimerEventHandler->Release();
}
Contoh kode berikut diambil dari MainWindow.cpp dalam sampel Animasi Windows Timer-Driven Animasi; lihat metode CMainWindow::InitializeAnimation. Ini memanggil metode QueryInterface pada objek manajer animasi untuk mendapatkan pointer ke IUIAnimationTimerUpdateHandler, kemudian menyambungkan objek UIAnimationManager dan UIAnimationTimer dengan mengatur manajer animasi sebagai penangani pembaruan timer menggunakan metode IUIAnimationTimer::SetTimerUpdateHandler. Perhatikan bahwa tidak perlu menghapus koneksi ini secara eksplisit; koneksi dibersihkan dengan aman setelah aplikasi merilis manajer animasi dan timer animasi.
// Connect the animation manager to the timer
IUIAnimationTimerUpdateHandler *pTimerUpdateHandler;
hr = m_pAnimationManager->QueryInterface(
IID_PPV_ARGS(&pTimerUpdateHandler)
);
if (SUCCEEDED(hr))
{
hr = m_pAnimationTimer->SetTimerUpdateHandler(
pTimerUpdateHandler
UI_ANIMATION_IDLE_BEHAVIOR_DISABLE // timer will shut itself off when there are no animations playing
);
pTimerUpdateHandler->Release();
if (SUCCEEDED(hr))
{
// Create and set the timer event handler
...
}
}
Jika UI_ANIMATION_IDLE_BEHAVIOR_DISABLE tidak digunakan, perlu juga mengaktifkan timer agar mulai berdetak.
Langkah Sebelumnya
Sebelum memulai langkah ini, Anda harus telah menyelesaikan langkah ini: Membuat Variabel Animasi.
Langkah Berikutnya
Setelah menyelesaikan langkah ini, langkah selanjutnya adalah: Membaca Nilai Variabel Animasi.
Topik terkait