如何检测用户是不是在 c# 中摇晃(检测摇晃),

Posted

技术标签:

【中文标题】如何检测用户是不是在 c# 中摇晃(检测摇晃),【英文标题】:How to detect if user is shaking form c# (detect shake),如何检测用户是否在 c# 中摇晃(检测摇晃), 【发布时间】:2020-03-20 20:35:57 【问题描述】:

我已经制作了一个绘图克隆,并且想要在您摇动表单时清除边框(因此通过在顶部栏上按住 mouse1 并快速左右移动它)。 我试图比较 x 轴上的两个点,这些点是根据鼠标位置设置的,并针对阈值进行测试。而且我添加了一个组合,因此您需要多次克服阈值以避免意外激活,为此还有一个计时器可以重置组合。 问题在于它将快速移动到一侧视为晃动我仍然希望用户能够在不清除画布的情况下移动表单。

        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);
        

the form

【问题讨论】:

与其在else 中将isfirst 设置为true,不如考虑将firstpos 更改为secondpos 另外,跟踪diff 符号并计算它何时发生变化。 【参考方案1】:
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 超过所需的某个值时接受。

当鼠标按钮上升时不要忘记重置所有内容。

【讨论】:

最后一行不应该是 firstpos = secondpos 吗?

以上是关于如何检测用户是不是在 c# 中摇晃(检测摇晃),的主要内容,如果未能解决你的问题,请参考以下文章

UIAccelerometer 在摇晃

我如何将 iphone 运动检测用于类似鸡蛋摇晃的应用程序?

iOS 5 检测重复/连续摇晃

如何检测和编程为iPhone摇晃

目标 C:摇晃问题

如何在iOS中实现大力摇一摇?