如何获取两次鼠标移动之间的时间?

电脑杂谈  发布时间:2020-09-05 03:07:04  来源:网络整理

鼠标经过时间_笔记本插鼠标触摸板和鼠标不能用_软媒时间鼠标穿透

我正在尝试获取两次鼠标移动之间的时间(以毫秒为单位)。我正在使用一个库来处理鼠标移动事件以进行全局操作。问题在于,代码下方的时间始终为零。

  @Override 
public void mouseMoved(GlobalMouseEvent event )
{
//鼠标移动
moveCount ++的时间;

//如果是第一次移动鼠标,则它是开始时间
if(moveCount%2!= 0)
{
startTime = System.currentTimeMillis( );
}

//如果是第二次移动鼠标,则是结束
//时间
if(moveCount%2 == 0)
{
long endTime = System.currentTimeMillis();
long time =(endTime-startTime);

System.out.println(time);
}
}

解决方案

软媒时间鼠标穿透_笔记本插鼠标触摸板和鼠标不能用_鼠标经过时间

如果要检测鼠标移动及其属性,让我们首先定义移动:

鼠标移动可以定义为开始将鼠标指针从A点移动到B点,然后将鼠标指针停在B点超过一个阈值以将其检测为终点

如果我们定义了上述问题,则可以通过在鼠标开始移动并重新启动后启动计时器来解决此问题。鼠标移动时的计时器。然后,如果计时器在阈值之后过期,那么我们可以考虑从那里开始运动。那么鼠标指针从A点到B点的经过时间就是移动的时间。

鼠标经过时间_笔记本插鼠标触摸板和鼠标不能用_软媒时间鼠标穿透

要想以一种体面的方式写出上述想法,我们可以按以下格式定义MouseMovementListener,MouseMovementEvent和其他实用程序类:

我们的自定义事件:

  import java.awt.Point; 

公共类MouseMovementEvent {
private Point startPoint;
个私有Point端点;
私人Long startNanoTime;
私人Long endNanoTime;

public MouseMovementEvent(Point startPoint,Point endPoint,Long startNanoTime,Long endNanoTime){
this.startPoint = startPoint;
this.endPoint = endPoint;
this.startNanoTime = startNanoTime;
this.endNanoTime = endNanoTime;
}

public Point getStartPoint(){
return startPoint;
}
public Point getEndPoint(){
return endPoint;
}
public Long getStartNanoTime(){
return startNanoTime;
}
public Long getEndNanoTime(){
return endNanoTime;
}
public Long getMotionDurationInNanos(){
return endNanoTime-startNanoTime;
}
}

鼠标经过时间_软媒时间鼠标穿透_笔记本插鼠标触摸板和鼠标不能用

侦听器界面:

 公共接口MouseMovementListener {
void MovementOccured(MouseMovementEvent e);
}

然后使用代码监视鼠标的运动并将其转换为运动事件:

笔记本插鼠标触摸板和鼠标不能用_鼠标经过时间_软媒时间鼠标穿透

  import java.awt.Point; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JComponent;
import javax.swing.Timer;

公共类MouseMovementMonitor {

private Point startPoint;
private Point currentPoint;
私人Long startTime;
私人计时器;

public MouseMovementMonitor(JComponent componentToMonitor,int motionTimeDelay,最后的MouseMovementListener运动器){
timer = new Timer(motionTimeDelay,new ActionListener(){

@Override
public void actionPerformed(ActionEvent e){

if(startPoint!= null&&!startPoint.equals(currentPoint)){
MovementListener.movementOccured(
new MouseMovementEvent(startPoint,currentPoint,startTime,System.nanoTime())
);
}

startPoint = null; //可以是
startTime = null;

//或重置过程可以如下,而不是上面的两行:
// startPoint = currentPoint;
// startTime = System.nanoTime();

timer.stop();
}

});

componentToMonitor.addMouseMotionListener(new MouseMotionAdapter(){

@Override
public void mouseMoved(MouseEvent e){
if(startPoint == null) {
startPoint = e.getPoint();
startTime = System.nanoTime();
}
currentPoint = e.getPoint();
//
if(timer.isRunning())
timer.restart();
else
timer.start();
}
});
}
}

最后一次测试:

  import java.awt.BorderLayout; 
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

公共类测试{
public static void main(String [] args){
JPanel p = new JPanel();
p.setBackground(Color.PINK);

新的MouseMovementMonitor(p,500,新的MouseMovementListener(){
@Override
public void MovementOccured(MouseMovementEvent e){
System.out.println(" Movement持续时间(以纳秒为单位):" + e.getMotionDurationInNanos());
}
});

JFrame f = new JFrame();
f.setBounds(200,200,200,200);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setLayout(new BorderLayout());
f.add(p,BorderLayout.CENTER);
f.setVisible(true);
}
}

在此示例中,我没有公开起点和终点,但是如果需要,我们的MouseMovementEvent对象具有此信息。

希望这会有所帮助!


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-314121-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...