Как определить, трясет ли пользователь форму c# (обнаружить тряску), - PullRequest
2 голосов
/ 20 марта 2020

Я сделал клон краски и хочу очистить борд, когда вы встряхиваете форму (так, удерживая mouse1 на верхней панели и перемещая ее вправо и влево быстро). Я попытался сравнить две точки на оси х, точки устанавливаются на основе положения мыши и проверяются на соответствие порогу. И я добавил комбо, так что вам нужно преодолеть порог несколько раз, чтобы избежать случайной активации, чтобы помочь с этим, есть также таймер, который сбрасывает комбо. Проблема в том, что он видит быстрое движение в одну сторону как дрожь Я все еще хочу, чтобы пользователь мог перемещать форму без очистки холста.

        int firstpos = 0;
        int secondpos = 0;
        bool isfirst = true;
        int combo = 0;
        int threshold = 50;
        Point lastPoint;

        private void TopBar_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)//to move the form
            {
                this.Left += e.X - lastPoint.X;
                this.Top += e.Y - lastPoint.Y;
            }
            if (isfirst)
            {
                firstpos = e.X;
                isfirst = false;
            }
            else
            {
                secondpos = e.X;
                int diff = secondpos - firstpos;
                if (diff < 0) diff *= -1;//make positive
                if (diff >= threshold)
                {
                    combo++;
                    Thread t = new Thread(startdecay);
                    t.Start();
                }
                if (combo == 4)
                {
                    canvas.Invalidate();//clear the canvas
                    combo = 0;
                }
                isfirst = true;
            }
        }

        void startdecay()
        {
            Thread.Sleep(1000);
            combo = 0;
        }

        private void TopBar_MouseDown(object sender, MouseEventArgs e)
        {
            lastPoint = new Point(e.X, e.Y);
        }

форма

1 Ответ

1 голос
/ 21 марта 2020
isfirst == true: Save firstpos.
                 Set isfirst = false.

isfirst == false: Get secondpos.
                  Get diff.
                  if Math.Sign(diff) != saveddiff {
                      increment shakecounter.
                      Set saveddiff = Math.Sign(diff).
                  }
                  Set firstpos = secondpos.

Примите, когда shakecounter превысит желаемое значение.

Не забудьте сбросить все, когда кнопка мыши поднимется.

...