mirror of
https://github.com/godotengine/godot.git
synced 2025-02-16 07:40:36 +00:00
Merge pull request #88130 from AlekseyKapustyanenko/Rotary_Input
Add rotary input support for Android platform
This commit is contained in:
commit
afc49e52e4
@ -5,6 +5,7 @@
|
|||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
Stores information about mouse click events. See [method Node._input].
|
Stores information about mouse click events. See [method Node._input].
|
||||||
|
[b]Note:[/b] On Wear OS devices, rotary input is mapped to [constant MOUSE_BUTTON_WHEEL_UP] and [constant MOUSE_BUTTON_WHEEL_DOWN]. This can be changed to [constant MOUSE_BUTTON_WHEEL_LEFT] and [constant MOUSE_BUTTON_WHEEL_RIGHT] with the [member ProjectSettings.input_devices/pointing/android/rotary_input_scroll_axis] setting.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
<link title="Using InputEvent">$DOCS_URL/tutorials/inputs/inputevent.html</link>
|
<link title="Using InputEvent">$DOCS_URL/tutorials/inputs/inputevent.html</link>
|
||||||
|
@ -1361,6 +1361,9 @@
|
|||||||
<member name="input_devices/pointing/android/enable_pan_and_scale_gestures" type="bool" setter="" getter="" default="false">
|
<member name="input_devices/pointing/android/enable_pan_and_scale_gestures" type="bool" setter="" getter="" default="false">
|
||||||
If [code]true[/code], multi-touch pan and scale gestures are enabled on Android devices.
|
If [code]true[/code], multi-touch pan and scale gestures are enabled on Android devices.
|
||||||
</member>
|
</member>
|
||||||
|
<member name="input_devices/pointing/android/rotary_input_scroll_axis" type="int" setter="" getter="" default="1">
|
||||||
|
On Wear OS devices, defines which axis of the mouse wheel rotary input is mapped to. This rotary input is usually performed by rotating the physical or virtual (touch-based) bezel on a smartwatch.
|
||||||
|
</member>
|
||||||
<member name="input_devices/pointing/emulate_mouse_from_touch" type="bool" setter="" getter="" default="true">
|
<member name="input_devices/pointing/emulate_mouse_from_touch" type="bool" setter="" getter="" default="true">
|
||||||
If [code]true[/code], sends mouse input events when tapping or swiping on the touchscreen.
|
If [code]true[/code], sends mouse input events when tapping or swiping on the touchscreen.
|
||||||
</member>
|
</member>
|
||||||
|
@ -2879,7 +2879,7 @@ Error Main::setup2() {
|
|||||||
|
|
||||||
GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_long_press_as_right_click", false);
|
GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_long_press_as_right_click", false);
|
||||||
GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", false);
|
GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", false);
|
||||||
|
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "input_devices/pointing/android/rotary_input_scroll_axis", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1);
|
||||||
OS::get_singleton()->benchmark_end_measure("Startup", "Setup Window and Boot");
|
OS::get_singleton()->benchmark_end_measure("Startup", "Setup Window and Boot");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -610,11 +610,13 @@ class Godot(private val context: Context) : SensorEventListener {
|
|||||||
// These properties are defined after Godot setup completion, so we retrieve them here.
|
// These properties are defined after Godot setup completion, so we retrieve them here.
|
||||||
val longPressEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_long_press_as_right_click"))
|
val longPressEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_long_press_as_right_click"))
|
||||||
val panScaleEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures"))
|
val panScaleEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures"))
|
||||||
|
val rotaryInputAxis = java.lang.Integer.parseInt(GodotLib.getGlobal("input_devices/pointing/android/rotary_input_scroll_axis"));
|
||||||
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
renderView?.inputHandler?.apply {
|
renderView?.inputHandler?.apply {
|
||||||
enableLongPress(longPressEnabled)
|
enableLongPress(longPressEnabled)
|
||||||
enablePanningAndScalingGestures(panScaleEnabled)
|
enablePanningAndScalingGestures(panScaleEnabled)
|
||||||
|
setRotaryInputAxis(rotaryInputAxis)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +57,9 @@ import java.util.Set;
|
|||||||
public class GodotInputHandler implements InputManager.InputDeviceListener {
|
public class GodotInputHandler implements InputManager.InputDeviceListener {
|
||||||
private static final String TAG = GodotInputHandler.class.getSimpleName();
|
private static final String TAG = GodotInputHandler.class.getSimpleName();
|
||||||
|
|
||||||
|
private static final int ROTARY_INPUT_VERTICAL_AXIS = 1;
|
||||||
|
private static final int ROTARY_INPUT_HORIZONTAL_AXIS = 0;
|
||||||
|
|
||||||
private final SparseIntArray mJoystickIds = new SparseIntArray(4);
|
private final SparseIntArray mJoystickIds = new SparseIntArray(4);
|
||||||
private final SparseArray<Joystick> mJoysticksDevices = new SparseArray<>(4);
|
private final SparseArray<Joystick> mJoysticksDevices = new SparseArray<>(4);
|
||||||
|
|
||||||
@ -71,6 +74,8 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
*/
|
*/
|
||||||
private int lastSeenToolType = MotionEvent.TOOL_TYPE_UNKNOWN;
|
private int lastSeenToolType = MotionEvent.TOOL_TYPE_UNKNOWN;
|
||||||
|
|
||||||
|
private static int rotaryInputAxis = ROTARY_INPUT_VERTICAL_AXIS;
|
||||||
|
|
||||||
public GodotInputHandler(GodotRenderView godotView) {
|
public GodotInputHandler(GodotRenderView godotView) {
|
||||||
final Context context = godotView.getView().getContext();
|
final Context context = godotView.getView().getContext();
|
||||||
mRenderView = godotView;
|
mRenderView = godotView;
|
||||||
@ -102,6 +107,13 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
this.godotGestureHandler.setPanningAndScalingEnabled(enable);
|
this.godotGestureHandler.setPanningAndScalingEnabled(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On Wear OS devices, sets which axis of the mouse wheel rotary input is mapped to. This is 1 (vertical axis) by default.
|
||||||
|
*/
|
||||||
|
public void setRotaryInputAxis(int axis) {
|
||||||
|
rotaryInputAxis = axis;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isKeyEventGameDevice(int source) {
|
private boolean isKeyEventGameDevice(int source) {
|
||||||
// Note that keyboards are often (SOURCE_KEYBOARD | SOURCE_DPAD)
|
// Note that keyboards are often (SOURCE_KEYBOARD | SOURCE_DPAD)
|
||||||
if (source == (InputDevice.SOURCE_KEYBOARD | InputDevice.SOURCE_DPAD))
|
if (source == (InputDevice.SOURCE_KEYBOARD | InputDevice.SOURCE_DPAD))
|
||||||
@ -484,8 +496,22 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
final float tiltX = (float)-Math.sin(orientation) * tiltMult;
|
final float tiltX = (float)-Math.sin(orientation) * tiltMult;
|
||||||
final float tiltY = (float)Math.cos(orientation) * tiltMult;
|
final float tiltY = (float)Math.cos(orientation) * tiltMult;
|
||||||
|
|
||||||
final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
float verticalFactor = 0;
|
||||||
final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
|
float horizontalFactor = 0;
|
||||||
|
|
||||||
|
// If event came from RotaryEncoder (Bezel or Crown rotate event on Wear OS smart watches),
|
||||||
|
// convert it to mouse wheel event.
|
||||||
|
if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) {
|
||||||
|
if (rotaryInputAxis == ROTARY_INPUT_HORIZONTAL_AXIS) {
|
||||||
|
horizontalFactor = -event.getAxisValue(MotionEvent.AXIS_SCROLL);
|
||||||
|
} else {
|
||||||
|
// If rotaryInputAxis is not ROTARY_INPUT_HORIZONTAL_AXIS then use default ROTARY_INPUT_VERTICAL_AXIS axis.
|
||||||
|
verticalFactor = -event.getAxisValue(MotionEvent.AXIS_SCROLL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
||||||
|
horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
|
||||||
|
}
|
||||||
boolean sourceMouseRelative = false;
|
boolean sourceMouseRelative = false;
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||||
sourceMouseRelative = event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE);
|
sourceMouseRelative = event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE);
|
||||||
|
Loading…
Reference in New Issue
Block a user