WinForms での単純なアニメーション
質問
WinForm 上でオブジェクトをアニメーション化したいと想像してください。タイマーを設定して状態またはモデルを更新し、フォームのペイント イベントをオーバーライドします。しかし、そこからアニメーション用にフォームを継続的に再描画する最善の方法は何でしょうか?
- 描画が完了したらすぐにフォームを無効にしますか?
- 2 番目のタイマーを設定して、定期的にフォームを無効にしますか?
- おそらくこれには共通のパターンがあるのでしょうか?
- 役立つ便利な .NET クラスはありますか?
これを行う必要があるたびに、新しい欠点を伴う新しい方法を発見します。SO コミュニティからの経験と推奨事項は何ですか?
解決
状況によっては、paint イベントを使用して描画するのではなく、コントロール/フォームから Graphics オブジェクトを取得し、その「上に」描画する方が速くて便利です。これにより、不透明度/アンチエイリアス/テキストなどで問題が発生する可能性がありますが、シャバン全体を再ペイントする必要がないという点では、苦労する価値があるかもしれません。次のようなもの:
private void AnimationTimer_Tick(object sender, EventArgs args)
{
// First paint background, like Clear(Control.Background), or by
// painting an image you have previously buffered that was the background.
animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++]));
}
私自身もいくつかのコントロールでこれを使用しており、対象のオブジェクトが移動したり削除する必要がある場合に背景を「クリア」するために画像をバッファリングしました。
他のヒント
これに役立つライブラリを作成しました。これはトランジションと呼ばれるもので、ここにあります。 http://code.google.com/p/dot-net-transitions/
バックグラウンド スレッドで実行されるタイマーを使用して、オブジェクトをアニメーション化します。このライブラリはオープンソースなので、役立つ場合はコードを見て、それが何をしているのかを確認することができます。
あなたがやっていることは、私がこれまでに WinForms で使用した唯一の解決策です (定期的に再描画を行うタイマー)。ユーザーのエクスペリエンスをよりスムーズにするために使用できるテクニックはたくさんあります (ダブルバッファリングなど)。
WPF を試してみるとよいでしょう。WPF にはアニメーションを実行するための機能が組み込まれており、タイマー ベースのソリューションよりもはるかにスムーズです (必要なコードが少なく、ユーザー側での同期も必要ありません)。
このソリューションでは、アプリ全体で WPF を使用する必要はないことに注意してください。この機能を WPF コントロールにパックし、そのコントロールを WinForms アプリケーション (またはアンマネージ アプリ) に埋め込むことができます。