Handle pointer capture on SOURCE_TOUCHPAD devices

This commit is contained in:
Cameron Gutman 2021-02-27 15:48:37 -06:00
parent 54ebd0a796
commit 20ced841dd
2 changed files with 14 additions and 5 deletions

View File

@ -1187,6 +1187,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
{ {
// This case is for mice and non-finger touch devices // This case is for mice and non-finger touch devices
if (event.getSource() == InputDevice.SOURCE_MOUSE || if (event.getSource() == InputDevice.SOURCE_MOUSE ||
event.getSource() == InputDevice.SOURCE_TOUCHPAD ||
event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE || event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE ||
(event.getPointerCount() >= 1 && (event.getPointerCount() >= 1 &&
(event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE || (event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE ||

View File

@ -38,23 +38,31 @@ public class AndroidNativePointerCaptureProvider extends AndroidPointerIconCaptu
@Override @Override
public boolean eventHasRelativeMouseAxes(MotionEvent event) { public boolean eventHasRelativeMouseAxes(MotionEvent event) {
return event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE; // SOURCE_MOUSE_RELATIVE is how SOURCE_MOUSE appears when our view has pointer capture.
// SOURCE_TOUCHPAD will have relative axes populated iff our view has pointer capture.
// See https://developer.android.com/reference/android/view/View#requestPointerCapture()
return event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE ||
(event.getSource() == InputDevice.SOURCE_TOUCHPAD && targetView.hasPointerCapture());
} }
@Override @Override
public float getRelativeAxisX(MotionEvent event) { public float getRelativeAxisX(MotionEvent event) {
float x = event.getX(); int axis = (event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE) ?
MotionEvent.AXIS_X : MotionEvent.AXIS_RELATIVE_X;
float x = event.getAxisValue(axis);
for (int i = 0; i < event.getHistorySize(); i++) { for (int i = 0; i < event.getHistorySize(); i++) {
x += event.getHistoricalX(i); x += event.getHistoricalAxisValue(axis, i);
} }
return x; return x;
} }
@Override @Override
public float getRelativeAxisY(MotionEvent event) { public float getRelativeAxisY(MotionEvent event) {
float y = event.getY(); int axis = (event.getSource() == InputDevice.SOURCE_MOUSE_RELATIVE) ?
MotionEvent.AXIS_Y : MotionEvent.AXIS_RELATIVE_Y;
float y = event.getAxisValue(axis);
for (int i = 0; i < event.getHistorySize(); i++) { for (int i = 0; i < event.getHistorySize(); i++) {
y += event.getHistoricalY(i); y += event.getHistoricalAxisValue(axis, i);
} }
return y; return y;
} }