如何在不使用System.Threading.Thread.Sleep()的情况下延迟动画

时间:2017-10-14 20:20:32

标签: c# animation sleep

我想移动我的文字,但如果我使用void onClick(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) drawHouse(x,y); } ,我的应用就会卡住。我认为使用System.Threading.Thread.Sleep()是解决问题的好方法,但请告诉我如何做。我也试图使用Timer,但我没有通过这种方式解决它。

Animate()

假设我单击某个按钮然后出现文本 - “+1”并且它将向上移动并降低不透明度。最后它会消失。

2 个答案:

答案 0 :(得分:0)

您必须在Timer循环中创建for,并用Tick事件替换循环。目前,您在每次循环迭代中重新创建Timer。将它作为控件的组件,如下所示:

// Timer Interval is set to 0,5 second
private Timer _timer = new Timer { Interval = 500 };

并在控件中添加以下字段

private int _index = 0;
private int _maxIndex = 30;

在此delegate事件中添加Tick后,会在每个刻度线上向上移动文本。

this._timer.Tick += delegate
{
    if (this._index < this._maxIndex)
    {
        var alphaValue = 255 - this._index * 8;

        Brush snizovaniViditelnosti = new SolidBrush(Color.FromArgb(alphaValue, 255, 255, 255));
        g.DrawString("+1", fontPridaniMaterialu, snizovaniViditelnosti, MousePosition.X, MousePosition.Y - this._index);
        Refresh();

        this._index++;
    }
    else
    {
        this._timer.Stop();
    }
};

如果您只想降低不透明度,请降低alpha值并保留颜色 - 如上例所示。

并将其连接到您的Button点击事件

private void Button_Click(object sender, EventArgs e)
{
    this._timer.Start();
}

提示:这只是一个项目的快速解决方案。如果您要为多个项目执行此操作,则可以在包含文本的代码中添加一个类,Timer以及当前和maxIndex。

我猜你正在使用winforms 在重新绘制UI时避免闪烁。你应该激活double buffering 查看有关Handling and Raising Events

的更多信息

正如@apocalypse在他的回答中所建议的那样。最好为文本设置修复开始位置以便向上移动。

答案 1 :(得分:0)

从工具箱中抓取TimerButton

然后选择timer并转到events中的properties window部分。双击Tick事件。应用你的逻辑移动文本。

对于按钮,您需要使用click事件。

示例代码:

private void timer1_Tick (object sender, EventArgs e)
{
    button1.Location = new Point (button1.Location.X + 1, button1.Location.Y);
}

private void button1_Click (object sender, EventArgs e)
{
    timer1.Start ();
}