所以基本上我正在制作一个自定义按钮。
当用户将鼠标悬停时,鼠标悬停图片将会淡入。
当用户鼠标移开时,鼠标悬停/按下的图片将淡出。
如果用户在播放淡入淡出动画时进入或关闭,则需要:
答案 0 :(得分:2)
之前我做了类似的事情,并使用GDI +实现了它。
按钮应该在它的绘制方法中做两件事。
使用BackgroundWorker为您提供流畅的动画。因此,在mouseover上启动BackgroundWorker并使其运行直到Alpha达到1.0f。当鼠标从按钮中移除时,工作人员应该减少Alpha,直到它达到0.0f。有一个名为fadingin的变量,以便BackgroundWorker了解它应该做什么。你的鼠标进出事件应该正确设置fadingin为true或false,然后启动BackgroundWorker(如果它还没有运行)。
BackgroundWorkers 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动画。
backgroundWorker ProgressChanged应该只将ColorMatrix更改为正确的alpha值,并将ColorMatrix绑定到ImageAttributes,并通过调用Invalidate使控件无效。必须这样做,以便从主线程请求GUI重绘,而不是BackgroundWorker线程。如果直接从DoWork执行此操作,如果在绘制操作过程中尝试修改ImageAttributes,则会出现异常。
希望这可以帮助您在按钮上制作出流畅的动画。
答案 1 :(得分:0)
您需要选择一张图片放在底部,一张放在顶部。顶部的那个将需要逐步调整从0到255的alpha值来创建动画。
此MSDN forum thread详细说明了混合的方法。