116 lines
2.9 KiB
Java
116 lines
2.9 KiB
Java
/**
|
|
* Copyright (c) 2010 Michael A. MacDonald
|
|
*/
|
|
package android.androidVNC;
|
|
|
|
import android.graphics.PointF;
|
|
import android.os.Handler;
|
|
import android.view.KeyEvent;
|
|
import android.view.MotionEvent;
|
|
|
|
/**
|
|
* Input handlers delegate to this class to handle keystrokes; this detects keystrokes
|
|
* from the DPad and uses them to perform mouse actions; other keystrokes are passed to
|
|
* VncCanvasActivity.defaultKeyXXXHandler
|
|
*
|
|
* @author Michael A. MacDonald
|
|
*
|
|
*/
|
|
class DPadMouseKeyHandler {
|
|
private MouseMover mouseMover;
|
|
private boolean mouseDown;
|
|
private VncCanvasActivity activity;
|
|
private VncCanvas canvas;
|
|
private boolean isMoving;
|
|
|
|
DPadMouseKeyHandler(VncCanvasActivity activity, Handler handler)
|
|
{
|
|
this.activity = activity;
|
|
canvas = activity.vncCanvas;
|
|
mouseMover = new MouseMover(activity, handler);
|
|
}
|
|
|
|
public boolean onKeyDown(int keyCode, KeyEvent evt) {
|
|
int xv = 0;
|
|
int yv = 0;
|
|
boolean result = true;
|
|
switch (keyCode) {
|
|
case KeyEvent.KEYCODE_DPAD_LEFT:
|
|
xv = -1;
|
|
break;
|
|
case KeyEvent.KEYCODE_DPAD_RIGHT:
|
|
xv = 1;
|
|
break;
|
|
case KeyEvent.KEYCODE_DPAD_UP:
|
|
yv = -1;
|
|
break;
|
|
case KeyEvent.KEYCODE_DPAD_DOWN:
|
|
yv = 1;
|
|
break;
|
|
case KeyEvent.KEYCODE_DPAD_CENTER:
|
|
if (!mouseDown) {
|
|
mouseDown = true;
|
|
result = canvas.processPointerEvent(canvas.mouseX, canvas.mouseY, MotionEvent.ACTION_DOWN, evt.getMetaState(), mouseDown, canvas.cameraButtonDown);
|
|
}
|
|
break;
|
|
default:
|
|
result = activity.defaultKeyDownHandler(keyCode, evt);
|
|
break;
|
|
}
|
|
if ((xv != 0 || yv != 0) && !isMoving) {
|
|
final int x = xv;
|
|
final int y = yv;
|
|
isMoving = true;
|
|
mouseMover.start(x, y, new Panner.VelocityUpdater() {
|
|
|
|
/*
|
|
* (non-Javadoc)
|
|
*
|
|
* @see android.androidVNC.Panner.VelocityUpdater#updateVelocity(android.graphics.Point,
|
|
* long)
|
|
*/
|
|
@Override
|
|
public boolean updateVelocity(PointF p, long interval) {
|
|
double scale = (1.2 * (double) interval / 50.0);
|
|
if (Math.abs(p.x) < 500)
|
|
p.x += (int) (scale * x);
|
|
if (Math.abs(p.y) < 500)
|
|
p.y += (int) (scale * y);
|
|
return true;
|
|
}
|
|
|
|
});
|
|
canvas.processPointerEvent(canvas.mouseX + x, canvas.mouseY + y, MotionEvent.ACTION_MOVE, evt.getMetaState(), mouseDown, canvas.cameraButtonDown);
|
|
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public boolean onKeyUp(int keyCode, KeyEvent evt) {
|
|
boolean result = false;
|
|
|
|
switch (keyCode) {
|
|
case KeyEvent.KEYCODE_DPAD_LEFT:
|
|
case KeyEvent.KEYCODE_DPAD_RIGHT:
|
|
case KeyEvent.KEYCODE_DPAD_UP:
|
|
case KeyEvent.KEYCODE_DPAD_DOWN:
|
|
mouseMover.stop();
|
|
isMoving = false;
|
|
result = true;
|
|
break;
|
|
case KeyEvent.KEYCODE_DPAD_CENTER:
|
|
if (mouseDown) {
|
|
mouseDown = false;
|
|
result = canvas.processPointerEvent(canvas.mouseX, canvas.mouseY, MotionEvent.ACTION_UP, evt.getMetaState(), mouseDown, canvas.cameraButtonDown);
|
|
} else {
|
|
result = true;
|
|
}
|
|
break;
|
|
default:
|
|
result = activity.defaultKeyUpHandler(keyCode, evt);
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
}
|