动画:滑动& C#表单上的淡化控件(winforms)

时间:2010-05-27 01:22:09

标签: c# winforms math sliding

我正在尝试优雅地实现一种方法来动画(平移,淡化)控件(可能同时多于一个)。例如,假设我左上角有一张图片,右下角有一个文本框,我希望能够让它们平滑地滑过窗口并切换位置。我已经工作了一段时间但没有提出任何能够顺利或轻松实现这一目标的事情。

5 个答案:

答案 0 :(得分:19)

查看Google代码上的dot-net-transitions项目。现在Github here.上有一个克隆版本,它也可以作为dot-net-transitions在nuget上使用。它支持各种线性/非线性转换,包括复合转换,可用于更复杂的效果,如纹波。

这是一个展示您所需行为的工作示例:

var pictureBox = new PictureBox
    {
        ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png",
        SizeMode = PictureBoxSizeMode.AutoSize
    };
var textBox = new TextBox
    {
        Text = "Hello World",
        Location = new Point(140, 140)
    };
var form = new Form
    {
        Controls =
        {
            textBox,
            pictureBox
        }
    };
form.Click += (sender, e) =>
    {
        // swap the Left and Top properties using a transition
        var t = new Transition(new TransitionType_EaseInEaseOut(1000));
        t.add(pictureBox, "Left", textBox.Left);
        t.add(pictureBox, "Top", textBox.Top);
        t.add(textBox, "Left", pictureBox.Left);
        t.add(textBox, "Top", pictureBox.Top);
        t.run();
    };
form.ShowDialog();

答案 1 :(得分:7)

我建议您切换到WPF;这将使它变得容易。

在WinForms中完全不可能淡化控件; Windows控件不能具有不透明度 最接近的是将窗体上的控件及其区域渲染为一对位图,然后使用ColorMatrix对PictureBox中的位图进行交叉淡化。

要在WinForms中滑动控件,您可以使用Timer逐步更改控件的Top和/或Left属性,并在窗体中移动它们。但是,你会得到一个恼人的闪烁,这是(AFAIK)无法删除。

答案 2 :(得分:2)

可以在WinForms中做这件事,付出了很多努力,所以我不得不推荐使用WPF(这主要是针对这种事情构建的)。

在WinForms中执行此操作的主要障碍是控件位置由整数指定,这意味着您无法将控件的Left属性设置为45.3425。这基本上使得控制的平滑动画(假设你想要改变速度和方向的运动)完全不可能 - 你将以这种方式获得不可避免的运动急动(我已经尝试过,所以我知道)。

正如SLaks所说,在WinForms中执行此操作的唯一方法是通过获取每个控件的“快照”来“伪造”它。基本上,您将从表单大小的不可见位图开始,使用表单的BackColor绘制。然后,您可以通过在要设置动画的每个控件上调用DrawToBitmap()来创建“快照”,并通过将快照绘制到画布上来创建移动效果(System.Drawing可以使用浮点坐标绘制图像,从而避免整数位置的急动)。

但是,这太糟糕了。只需使用WPF。 :)

编辑:我应该提一下,在WinForms中做这样的事情实际上是 easy ,只要你不介意它看起来很可怕,生涩和业余。我上面的评论提到了这样做的难度很好

答案 3 :(得分:0)

将每个项目的x和y值的副本保存为浮点数。

使用计时器,每次勾选时,在左上角项目的x和y位置添加一个值。从右下角的项目x和y中减去相同的值。

请确保在此处使用缓存的浮点值,否则在表单上重新定位项时可能会出现舍入错误。

如果您在用于图像/控件的任何表面上进行绘画,请为每个刻度线使其无效。

应该很容易。

编辑:

对于透明控件,请查看Bob Powell的提示&招数:

http://www.bobpowell.net/transcontrols.htm

以下是他自己对如何进行半透明控制的回复:

http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

答案 4 :(得分:0)

我相信使用内置AnimateWindow的这个答案为此目的要好得多: How can I add moving effects to my controls in C#?