题
因此,基本上是我制作一个自定义按钮。
期望的行为:
当用户慕斯过来时,鼠标图将逐渐消失。
当用户从鼠标上熔断/按下的图片将逐渐消失。
例外:
如果用户在播放淡出动画时将用户放入或关闭,则需要:
- 立即停止当前播放动画
- 从当前位置开始淡入新动画。示例:可以说,用户慕斯已经结束了,如果鼠标动画要鼠标关闭,则鼠标动画已经播放,然后在鼠标off动画仍在播放时迅速恢复鼠标,从一开始就不会逐渐淡出鼠标。但是鼠标动画停止了。
解决方案
我以前做过类似的事情,并使用GDI+实施了它。
该按钮应在其绘制方法中执行两件事。
- 绘制默认按钮,而无需任何透明度。
- 用给定的alpha绘制MouseOve图像。
使用背景工作者为您提供平滑的动画。因此,在鼠标上启动背景工作者,并使它运行到alpha达到1.0f。当鼠标从按钮中删除时,工人应减少α取消,直到达到0.0F。拥有一个称为fadingin的变量,以便背景工作者了解应该做什么。您的鼠标内外事件应仅适当地将Fadingin设置为True或False,然后启动背景工作人员(如果尚未符合Runnung)。
背景工作者陶•方法看起来像这样:
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动画。
背景工作者的进度应将其更改为适当的alpha值,并将colormatrix绑定到ImageAttributes,并通过调用无效的控制使控件无效。必须这样做,以便从主线程中请求GUI重新粉刷,而不是背景工作人员线程。如果您直接从Dowork进行此操作,则如果您在进行抽奖操作时尝试修改成像量,则将获得异常。
希望这可以帮助您在按钮上制作一个良好的平滑动画。
其他提示
您需要选择一张图片才能在底部,而在顶部。顶部的一个将需要以步骤从0调整到255的alpha值来创建动画。
这 MSDN论坛线程 详细说明混合的方法。
不隶属于 StackOverflow