Browse Source

Add configuration option to disable `Scroll Deadzone` on Android

Alex 11 months ago
parent
commit
cd68034e01

+ 1 - 0
core/config/project_settings.cpp

@@ -1622,6 +1622,7 @@ ProjectSettings::ProjectSettings() {
 	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);
 	GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "input_devices/pointing/android/rotary_input_scroll_axis", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1);
 	GLOBAL_DEF("input_devices/pointing/android/override_volume_buttons", false);
 	GLOBAL_DEF("input_devices/pointing/android/override_volume_buttons", false);
+	GLOBAL_DEF_BASIC("input_devices/pointing/android/disable_scroll_deadzone", false);
 
 
 	// These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix().
 	// These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix().
 	GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());
 	GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());

+ 3 - 0
doc/classes/ProjectSettings.xml

@@ -1514,6 +1514,9 @@
 			- [code]wintab[/code], uses Wacom "WinTab" driver.
 			- [code]wintab[/code], uses Wacom "WinTab" driver.
 			- [code]dummy[/code], tablet input is disabled.
 			- [code]dummy[/code], tablet input is disabled.
 		</member>
 		</member>
+		<member name="input_devices/pointing/android/disable_scroll_deadzone" type="bool" setter="" getter="" default="false">
+			If [code]true[/code], disables the scroll deadzone on Android, allowing even very small scroll movements to be registered. This may increase scroll sensitivity but can also lead to unintended scrolling from slight finger movements.
+		</member>
 		<member name="input_devices/pointing/android/enable_long_press_as_right_click" type="bool" setter="" getter="" default="false">
 		<member name="input_devices/pointing/android/enable_long_press_as_right_click" type="bool" setter="" getter="" default="false">
 			If [code]true[/code], long press events on an Android touchscreen are transformed into right click events.
 			If [code]true[/code], long press events on an Android touchscreen are transformed into right click events.
 		</member>
 		</member>

+ 5 - 0
platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt

@@ -497,6 +497,11 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
 	protected open fun enableLongPressGestures() =
 	protected open fun enableLongPressGestures() =
 		java.lang.Boolean.parseBoolean(GodotLib.getEditorSetting("interface/touchscreen/enable_long_press_as_right_click"))
 		java.lang.Boolean.parseBoolean(GodotLib.getEditorSetting("interface/touchscreen/enable_long_press_as_right_click"))
 
 
+	/**
+	 * Disable scroll deadzone for the Godot Android editor.
+	 */
+	protected open fun disableScrollDeadzone() = true
+
 	/**
 	/**
 	 * Enable pan and scale gestures for the Godot Android editor.
 	 * Enable pan and scale gestures for the Godot Android editor.
 	 */
 	 */

+ 2 - 0
platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt

@@ -52,6 +52,8 @@ abstract class BaseGodotGame: GodotEditor() {
 
 
 	override fun enablePanAndScaleGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures"))
 	override fun enablePanAndScaleGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures"))
 
 
+	override fun disableScrollDeadzone() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone"))
+
 	override fun onGodotSetupCompleted() {
 	override fun onGodotSetupCompleted() {
 		super.onGodotSetupCompleted()
 		super.onGodotSetupCompleted()
 		Log.v(TAG, "OnGodotSetupCompleted")
 		Log.v(TAG, "OnGodotSetupCompleted")

+ 2 - 0
platform/android/java/lib/src/org/godotengine/godot/Godot.kt

@@ -715,12 +715,14 @@ class Godot(private val context: Context) {
 		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 rotaryInputAxisValue = GodotLib.getGlobal("input_devices/pointing/android/rotary_input_scroll_axis")
 		val rotaryInputAxisValue = GodotLib.getGlobal("input_devices/pointing/android/rotary_input_scroll_axis")
 		val overrideVolumeButtons = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/override_volume_buttons"))
 		val overrideVolumeButtons = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/override_volume_buttons"))
+		val scrollDeadzoneDisabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone"))
 
 
 		runOnUiThread {
 		runOnUiThread {
 			renderView?.inputHandler?.apply {
 			renderView?.inputHandler?.apply {
 				enableLongPress(longPressEnabled)
 				enableLongPress(longPressEnabled)
 				enablePanningAndScalingGestures(panScaleEnabled)
 				enablePanningAndScalingGestures(panScaleEnabled)
 				setOverrideVolumeButtons(overrideVolumeButtons)
 				setOverrideVolumeButtons(overrideVolumeButtons)
+				disableScrollDeadzone(scrollDeadzoneDisabled)
 				try {
 				try {
 					setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue))
 					setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue))
 				} catch (e: NumberFormatException) {
 				} catch (e: NumberFormatException) {

+ 4 - 2
platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt

@@ -55,6 +55,8 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler)
 	 */
 	 */
 	var panningAndScalingEnabled = false
 	var panningAndScalingEnabled = false
 
 
+	var scrollDeadzoneDisabled = false
+
 	private var nextDownIsDoubleTap = false
 	private var nextDownIsDoubleTap = false
 	private var dragInProgress = false
 	private var dragInProgress = false
 	private var scaleInProgress = false
 	private var scaleInProgress = false
@@ -153,7 +155,7 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler)
 		if (contextClickInProgress) {
 		if (contextClickInProgress) {
 			inputHandler.handleMouseEvent(event, event.actionMasked, MotionEvent.BUTTON_SECONDARY, false)
 			inputHandler.handleMouseEvent(event, event.actionMasked, MotionEvent.BUTTON_SECONDARY, false)
 			return true
 			return true
-		} else if (!scaleInProgress) {
+		} else if (scrollDeadzoneDisabled && !scaleInProgress) {
 			// The 'onScroll' event is triggered with a long delay.
 			// The 'onScroll' event is triggered with a long delay.
 			// Force the 'InputEventScreenDrag' event earlier here.
 			// Force the 'InputEventScreenDrag' event earlier here.
 			// We don't toggle 'dragInProgress' here so that the scaling logic can override the drag operation if needed.
 			// We don't toggle 'dragInProgress' here so that the scaling logic can override the drag operation if needed.
@@ -191,7 +193,7 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler)
 		distanceY: Float
 		distanceY: Float
 	): Boolean {
 	): Boolean {
 		if (scaleInProgress) {
 		if (scaleInProgress) {
-			if (dragInProgress || lastDragX != 0.0f || lastDragY != 0.0f) {
+			if (dragInProgress || (scrollDeadzoneDisabled && (lastDragX != 0.0f || lastDragY != 0.0f))) {
 				if (originEvent != null) {
 				if (originEvent != null) {
 					// Cancel the drag
 					// Cancel the drag
 					inputHandler.handleMotionEvent(originEvent, MotionEvent.ACTION_CANCEL)
 					inputHandler.handleMotionEvent(originEvent, MotionEvent.ACTION_CANCEL)

+ 7 - 0
platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java

@@ -114,6 +114,13 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
 		this.gestureDetector.setIsLongpressEnabled(enable);
 		this.gestureDetector.setIsLongpressEnabled(enable);
 	}
 	}
 
 
+	/**
+	 * Disable scroll deadzone. This is false by default.
+	 */
+	public void disableScrollDeadzone(boolean disable) {
+		this.godotGestureHandler.setScrollDeadzoneDisabled(disable);
+	}
+
 	/**
 	/**
 	 * Enable multi-fingers pan & scale gestures. This is false by default.
 	 * Enable multi-fingers pan & scale gestures. This is false by default.
 	 * <p>
 	 * <p>