1

(注:関連するQ + Aがあることは知っていますが、それはタイマーの終了に関連していますが、私のものはダニに関係しています)

このコードは、2点間を移動する長方形をアニメートするために使用されます。現時点では、最初の動きは完璧ですが、その後は毎回、アニメーションが呼び出されるたびにアニメーションが大幅に速くなります。

ティックごとに長方形の動きを呼び出す方法についての私の側の誤解によるものだと思います。

どんな助けでも大歓迎です!

このセクションはタイマーを開始します:

        if (floorNo == 2)
        {
            timerDown.Tick += new EventHandler(timer_LiftDown);
            timerDown.Interval = 10;
            timerDown.Enabled = true;
            timerDown.Start();
        }

このコードはティックごとに呼び出されます(右?):

    void timer_LiftDown(object sender, EventArgs e)
    {
        rectangle1.Location = new Point(192, rectangle1.Location.Y + 2);
        if (rectangle1.Location.Y >= 196)
        {
            timerDown.Stop();
        }
    }

いくつかの無関係なコードを切り取りました(たとえば、現在の状態でテキストボックスを更新する、floorNo変数を変更するなど)。

ありがとうございました。

4

2 に答える 2

3

イベントハンドラーを追加していますが、削除していません。したがって、アニメーションを呼び出すたびに、別のハンドラーが追加されます。そのため、各ティックは2回処理され、アニメーションが高速化されます。

追加する必要があります

timerDown.Tick -= new EventHandler(Timer_LiftDown);

コードのある時点で。残念ながら、提供したスニペットからは、これを安全に追加できる場所が明確ではありません。

于 2012-12-06T17:44:50.070 に答える
3

毎回イベントの購読と購読解除を行うのではなく、タイマーを1回設定してから、タイマーの開始/停止を呼び出すことをお勧めします。

//Somewhere in a load event...
timerDown.Tick += new EventHandler(timer_LiftDown);
timerDown.Interval = 10;
timerDown.Enabled = true;

//More code...

if (floorNo == 2)
{
    timerDown.Start();
}

//More code...

void timer_LiftDown(object sender, EventArgs e)
{
    rectangle1.Location = new Point(192, rectangle1.Location.Y + 2);
    if (rectangle1.Location.Y >= 196)
    {
        timerDown.Stop();
    }
}

そうすれば、タイマーを初期化して間隔を1回設定するだけで、自由に開始/停止できます。

于 2012-12-06T17:49:24.457 に答える