mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-20 03:23:07 +00:00
Improve dead zone precision for stylus input
This commit is contained in:
parent
0c72910eb7
commit
5b86e99138
@ -95,8 +95,11 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
private static final int REFERENCE_HORIZ_RES = 1280;
|
private static final int REFERENCE_HORIZ_RES = 1280;
|
||||||
private static final int REFERENCE_VERT_RES = 720;
|
private static final int REFERENCE_VERT_RES = 720;
|
||||||
|
|
||||||
private static final int STYLUS_DEAD_ZONE_DELAY = 250;
|
private static final int STYLUS_DOWN_DEAD_ZONE_DELAY = 100;
|
||||||
private static final int STYLUS_DEAD_ZONE_RADIUS = 50;
|
private static final int STYLUS_DOWN_DEAD_ZONE_RADIUS = 20;
|
||||||
|
|
||||||
|
private static final int STYLUS_UP_DEAD_ZONE_DELAY = 150;
|
||||||
|
private static final int STYLUS_UP_DEAD_ZONE_RADIUS = 50;
|
||||||
|
|
||||||
private static final int THREE_FINGER_TAP_THRESHOLD = 300;
|
private static final int THREE_FINGER_TAP_THRESHOLD = 300;
|
||||||
|
|
||||||
@ -119,8 +122,10 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
private boolean grabbedInput = true;
|
private boolean grabbedInput = true;
|
||||||
private boolean grabComboDown = false;
|
private boolean grabComboDown = false;
|
||||||
private StreamView streamView;
|
private StreamView streamView;
|
||||||
private long stylusDownTime = 0;
|
private long lastAbsTouchUpTime = 0;
|
||||||
private float stylusDownX, stylusDownY;
|
private long lastAbsTouchDownTime = 0;
|
||||||
|
private float lastAbsTouchUpX, lastAbsTouchUpY;
|
||||||
|
private float lastAbsTouchDownX, lastAbsTouchDownY;
|
||||||
|
|
||||||
private boolean isHidingOverlays;
|
private boolean isHidingOverlays;
|
||||||
private TextView notificationOverlayView;
|
private TextView notificationOverlayView;
|
||||||
@ -1252,16 +1257,16 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
if (event.getPointerCount() == 1 && event.getActionIndex() == 0) {
|
if (event.getPointerCount() == 1 && event.getActionIndex() == 0) {
|
||||||
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
|
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
|
||||||
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
|
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
|
||||||
stylusDownTime = SystemClock.uptimeMillis();
|
lastAbsTouchDownTime = SystemClock.uptimeMillis();
|
||||||
stylusDownX = event.getX(0);
|
lastAbsTouchDownX = event.getX(0);
|
||||||
stylusDownY = event.getY(0);
|
lastAbsTouchDownY = event.getY(0);
|
||||||
|
|
||||||
// Stylus is left click
|
// Stylus is left click
|
||||||
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_LEFT);
|
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_LEFT);
|
||||||
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
|
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
|
||||||
stylusDownTime = SystemClock.uptimeMillis();
|
lastAbsTouchDownTime = SystemClock.uptimeMillis();
|
||||||
stylusDownX = event.getX(0);
|
lastAbsTouchDownX = event.getX(0);
|
||||||
stylusDownY = event.getY(0);
|
lastAbsTouchDownY = event.getY(0);
|
||||||
|
|
||||||
// Eraser is right click
|
// Eraser is right click
|
||||||
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT);
|
conn.sendMouseButtonDown(MouseButtonPacket.BUTTON_RIGHT);
|
||||||
@ -1269,18 +1274,16 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
}
|
}
|
||||||
else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
|
else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
|
||||||
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
|
if (event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS) {
|
||||||
// It looks odd to set these on ACTION_UP, but it makes sense.
|
lastAbsTouchUpTime = SystemClock.uptimeMillis();
|
||||||
// The last "down" position is actually when we come up.
|
lastAbsTouchUpX = event.getX(0);
|
||||||
stylusDownTime = SystemClock.uptimeMillis();
|
lastAbsTouchUpY = event.getY(0);
|
||||||
stylusDownX = event.getX(0);
|
|
||||||
stylusDownY = event.getY(0);
|
|
||||||
|
|
||||||
// Stylus is left click
|
// Stylus is left click
|
||||||
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_LEFT);
|
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_LEFT);
|
||||||
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
|
} else if (event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) {
|
||||||
stylusDownTime = SystemClock.uptimeMillis();
|
lastAbsTouchUpTime = SystemClock.uptimeMillis();
|
||||||
stylusDownX = event.getX(0);
|
lastAbsTouchUpX = event.getX(0);
|
||||||
stylusDownY = event.getY(0);
|
lastAbsTouchUpY = event.getY(0);
|
||||||
|
|
||||||
// Eraser is right click
|
// Eraser is right click
|
||||||
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT);
|
conn.sendMouseButtonUp(MouseButtonPacket.BUTTON_RIGHT);
|
||||||
@ -1409,13 +1412,29 @@ public class Game extends Activity implements SurfaceHolder.Callback,
|
|||||||
float eventY = event.getY(0);
|
float eventY = event.getY(0);
|
||||||
|
|
||||||
if (event.getPointerCount() == 1 && event.getActionIndex() == 0 &&
|
if (event.getPointerCount() == 1 && event.getActionIndex() == 0 &&
|
||||||
(event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER) ||
|
(event.getToolType(0) == MotionEvent.TOOL_TYPE_ERASER ||
|
||||||
event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS)
|
event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS))
|
||||||
{
|
{
|
||||||
if (SystemClock.uptimeMillis() - stylusDownTime <= STYLUS_DEAD_ZONE_DELAY &&
|
switch (event.getActionMasked()) {
|
||||||
Math.sqrt(Math.pow(eventX - stylusDownX, 2) + Math.pow(eventY - stylusDownY, 2)) <= STYLUS_DEAD_ZONE_RADIUS) {
|
case MotionEvent.ACTION_DOWN:
|
||||||
// Ignore small inputs shortly after the stylus has been pressed. This ensures users can reliably double click.
|
case MotionEvent.ACTION_HOVER_ENTER:
|
||||||
return;
|
case MotionEvent.ACTION_HOVER_EXIT:
|
||||||
|
case MotionEvent.ACTION_HOVER_MOVE:
|
||||||
|
if (SystemClock.uptimeMillis() - lastAbsTouchUpTime <= STYLUS_UP_DEAD_ZONE_DELAY &&
|
||||||
|
Math.sqrt(Math.pow(eventX - lastAbsTouchUpX, 2) + Math.pow(eventY - lastAbsTouchUpY, 2)) <= STYLUS_UP_DEAD_ZONE_RADIUS) {
|
||||||
|
// Enforce a small deadzone between touch up and hover or touch down to allow more precise double-clicking
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
if (SystemClock.uptimeMillis() - lastAbsTouchDownTime <= STYLUS_DOWN_DEAD_ZONE_DELAY &&
|
||||||
|
Math.sqrt(Math.pow(eventX - lastAbsTouchDownX, 2) + Math.pow(eventY - lastAbsTouchDownY, 2)) <= STYLUS_DOWN_DEAD_ZONE_RADIUS) {
|
||||||
|
// Enforce a small deadzone between touch down and move or touch up to allow more precise double-clicking
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user