如何随着时间的推移记录移动,回放鼠标移动?

How to record movement over time, Having a playback of the mouse movements?

我正在尝试记录鼠标随时间的移动并在播放时查看它们(可能是视频,可食用)。当给定特定时间时,我需要能够检索鼠标在坐标中的确切位置。 例如:记录鼠标移动 20 秒。我需要在 10.6 秒获取鼠标的位置。

随时间存储这些鼠标坐标的最佳方法是什么? 最好的播放方式是让视频完整播放?

为了获取鼠标的坐标,我使用的是Java的官方鼠标移动监听器https://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html

public class MouseMotionEventDemo extends JPanel 
                                  implements MouseMotionListener {
    //...in initialization code:
        //Register for mouse events on blankArea and panel.
        blankArea.addMouseMotionListener(this);
        addMouseMotionListener(this);
        ...
    }

    public void mouseMoved(MouseEvent e) {
       saySomething("Mouse moved", e);
    }

    public void mouseDragged(MouseEvent e) {
       saySomething("Mouse dragged", e);
    }

    void saySomething(String eventDescription, MouseEvent e) {
        textArea.append(eventDescription 
                        + " (" + e.getX() + "," + e.getY() + ")"
                        + " detected on "
                        + e.getComponent().getClass().getName()
                        + newline);
    }
}

MouseEventclass分别有getX()等方法getXOnScreen(),Y轴也一样。

解决此问题的一种方法:创建一个包含您需要的信息的 class,例如:

class SimpleCoordinate {
  private final int x;
  ...

然后在你的主程序中:

List<SimpleCoordinate> coordinatesHistory = new ArrayList<>();

并在您的听众中执行:

coordinatesHistory.add(new SimpleCoordinate(...))

您在 class 中存储的具体内容由您决定。可能只是 "coordinates",但添加某种时间戳也可能有意义。

关键问题要仔细consider/design/test:

  • "granular" 鼠标侦听器如何(比如当你移动鼠标非常快时,你会得到多少事件)
  • 该程序应该记录多长时间(如果它应该记录用户 activity 的天数或周数,您可能 运行 内存不足,只需将该信息添加到内存即可)

当然,您也可以将记录推送到某些 "queue",并让另一个线程定期从队列中获取元素,以某种方式持久保存它们。