質問
基本的にカスタムボタンを作成しています。
望ましい動作:
ユーザーがムーズすると、マウスの写真が消えます。
ユーザーがマウスオーバー/押された画像からマウスをマウスすると、フェードアウトします。
例外:
フェードアニメーションが再生されている間にユーザーがマウスをかける、またはオフにする場合、次のことが必要になります。
- 現在再生されているアニメーションを即座に停止します
- 現在の位置から新しいアニメーションにフェードを開始します。例:ユーザーがマウスをマウスで覆い、マウスアニメーションが再生された場合、マウスアニメーションが再生された場合、マウスオフアニメーションがまだ再生されている間にマウスをすぐに戻してください。最初からフェードでマウスを開始することはありません。しかし、Mouseoffアニメーションが停止した場所から。
解決
私は以前にこれに似たことをし、GDI+を使用して実装しました。
ボタンは、描画方法で2つのことを行う必要があります。
- 透明性を敬意を表してデフォルトボタンを描画します。
- 特定のアルファでマウスブ画像を描画します。
背景ワーカーを使用して、スムーズなアニメーションを提供します。マウスオーバーでは、バックグラウンドワーカーを開始し、アルファに到達するまで実行します。マウスがボタンから取り外されると、ワーカーは0.0Fに達するまでアルファを減らす必要があります。 Fadinginと呼ばれる変数を持っているので、バックグラウンドワーカーが何をすべきかを理解します。マウスインとアウトイベントは、FadinginをTrueまたはFalseに適切に設定し、バックグラウンドワーカーを開始する必要があります(まだRunnungでない場合)。
バックグラウンドワーカーDoworkメソッドは次のようになります:
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
long ticks1 = 0;
long ticks2 = 0;
double interval = (double)Stopwatch.Frequency / 60;
while (true) {
ticks2 = Stopwatch.GetTimestamp();
if (ticks2 >= ticks1 + interval) {
ticks1 = Stopwatch.GetTimestamp();
if(_fadeIn){
_fadeAlpha += 0.1f;
if(_fadeAlpha > 1f){
_fadeAlpha = 1f;
break;
}
}else{
_fadeAlpha -= 0.1f;
if(_fadeAlpha < 0f){
_fadeAlpha = 0f;
break;
}
}
backgroundWorker.ReportProgress(0);
}
Thread.Sleep(1);
}
backgroundWorker.ReportProgress(0);
}
ここのストップウォッチとループの構築により、アニメーションが60fpsアニメーションを目指します。
ColudesChangedのバックグラウンドワーカーは、Colormatrixを適切なアルファ値に変更し、ColormatrixをImageAttributesに結合し、Invalidateを呼び出すことでコントロールを無効にします。これは、GUI塗り直しがバックグラウンドワーカースレッドではなくメインスレッドから要求されるように行う必要があります。 Doworkからこれを直接行うと、抽選操作が行われている間に画像を変更しようとすると、例外が得られます。
これがあなたのボタンに良い滑らかなアニメーションを作るのに役立つことを願っています。
他のヒント
一番下にあるためには、1つの写真を選択する必要があります。上にあるものは、アニメーションを作成するために、ステップで0から255に調整されたアルファ値が必要です。
これ MSDNフォーラムスレッド ブレンドの方法を詳細に説明します。