最近做了一个手机通过wifi控制电脑的小demo,其中进行鼠标移动控制的时候,出现了一些小bug,这里记录一下正确的移动方法,第一个方法也是最容易想到的,就是自己通过记忆上一次鼠标位置,计算距离偏差,代码如下:
int x= (int) event.getX();
int y= (int) event.getY();
int distantX=0;
int distantY=0;
synchronized (msgInfo){
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
msgInfo.setX(x);
msgInfo.setY(y);
msgInfo.setEventType(MsgInfo.MOUSE_MOVED);
msgInfo.setId(MsgInfo.ID_MOUSE);
oldx=x;
oldy=y;
msgInfo.setX(0);
msgInfo.setY(0);
//发送按下指令
break;
case MotionEvent.ACTION_MOVE:
msgInfo.setX(x);
msgInfo.setY(y);
++flag;
if (flag==1){
oldx=x;
oldy=y;
}
distantX=x-oldx;
distantY=y-oldy;
oldx=x;
oldy=y;
msgInfo.setX(distantX);
msgInfo.setY(distantY);
//发送移动指令
break;
case MotionEvent.ACTION_UP:
msgInfo.setX(x);
msgInfo.setY(y);
flag=0;
distantX=x-oldx;
distantY=y-oldy;
oldx=x;
oldy=y;
msgInfo.setX(distantX);
msgInfo.setY(distantY);
//发送抬起指令
break;
}
但是实际上android给我们提供了更方便的方法,那就是利用GestureDetector,也就android的手势识别,他提供了scroll方法帮我们计算滑动的距离,实现起来非常简单。所以第二个方法代码量不多,贴代码:
final GestureDetector detector=new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
synchronized (msgInfo){
msgInfo.setX((-(int)distanceX)*mouseDpi);//转化为相反数,否则方向相反
msgInfo.setY((-(int)distanceY)*mouseDpi);
msgInfo.setEventType(MsgInfo.MOUSE_MOVED);
msgInfo.setId(MsgInfo.ID_MOUSE);
Log.i("TAG", "onScroll: "+distanceX+","+distanceY);
Log.i("TAG", "e1: "+e1.getPointerCount()+",e2:"+e2.getPointerCount());
if (e2.getPointerCount()==2){
if (distanceY>0){
msgInfo.setEventType(MsgInfo.WHEEL_DOWN_PRESSED);
}else {
msgInfo.setEventType(MsgInfo.WHEEL_UP_PRESSED);
}
}
}
return true;
}
});
detector.onTouchEvent(event);//在监听函数onTouch里添加这句,替换掉原来的监听事件,最后记得返回true
注:1.msgInfo为需要通过socket发送的数据的包装
2.方法二后面的判断语句是为了判断多点触摸,然后模拟鼠标滚轮滑动