我有一个类目前在正常和鼠标悬停状态之间切换2个图像,但我想添加一个在2之间切换的微妙动画。
是否有任何(简单)方法可以让按钮从一个图像动画到另一个图像,例如IE 9浏览器中的按钮?
编辑:
由于joe_coolish的回答,这是我用于OnPaint重载的最终解决方案
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(_normalImage, 0, 0);
ColorMatrix matrix = new ColorMatrix();
matrix.Matrix33 = _opacity;
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
e.Graphics.DrawImage(_hotImage, this.DisplayRectangle, 0, 0,
this.DisplayRectangle.Width, this.DisplayRectangle.Height, GraphicsUnit.Pixel, attributes);
if (_opacity < 1 && _over)
{
_opacity += 0.02f;
_opacity = Math.Min(1, _opacity);
this.Invalidate();
}
if (_opacity > 0 && !_over)
{
_opacity -= 0.02f;
_opacity = Math.Max(0, _opacity);
this.Invalidate();
}
}
我最终不得不阻止将不透明度设置为高于1或低于0,否则我最终会遇到一些奇怪的行为。
注意:确保控件是双缓冲或者闪烁不良也很重要。
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
答案 0 :(得分:2)
图像有何不同?如果你想要一个“淡入/淡出”类型的东西,尝试这样的事情:
private float _opacity = 0.0f;
private bool _over = false;
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(imgOne);
ColorMatrix matrix = new ColorMatrix();
matrix.Matrix33 = _opacity; //opacity 0 = completely transparent, 1 = completely opaque
ImageAttributes attributes = new ImageAttributes();
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
e.Graphics.DrawImage(imgTwo, new Rectangle(0, 0, imgTwo.Width, imgTwo.Height), 0, 0, imgTwo.Width, imgTwo.Height, GraphicsUnit.Pixel, attributes);
if(_opacity < 1 && _over)
{
_opacity += 0.05f; // Play with this!!
Invalidate();
}
if(_opacity > 0 && !_over)
{
_opacity -= 0.05f; // Play with this!!
Invalidate();
}
}
然后只需在鼠标进出时设置_over
bool!
这是一个非常粗略的代码集,而IDK甚至可以编译,但这是一个非常好的起点!