Bladeren bron

Merge pull request #96139 from Alex2782/reverting_pr_84331

Add configuration option to disable `Scroll Deadzone` on Android
Thaddeus Crews 3 maanden geleden
bovenliggende
commit
4972a524fc

+ 1 - 0
core/config/project_settings.cpp

@@ -1651,6 +1651,7 @@ ProjectSettings::ProjectSettings() {
 	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("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().
 	GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());

+ 3 - 0
doc/classes/ProjectSettings.xml

@@ -1560,6 +1560,9 @@
 			- [code]wintab[/code], uses Wacom "WinTab" driver.
 			- [code]dummy[/code], tablet input is disabled.
 		</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">
 			If [code]true[/code], long press events on an Android touchscreen are transformed into right click events.
 		</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() =
 		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.
 	 */

+ 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 disableScrollDeadzone() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone"))
+
 	override fun onGodotSetupCompleted() {
 		super.onGodotSetupCompleted()
 		Log.v(TAG, "OnGodotSetupCompleted")

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

@@ -714,12 +714,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 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 scrollDeadzoneDisabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/disable_scroll_deadzone"))
 
 		runOnUiThread {
 			renderView?.inputHandler?.apply {
 				enableLongPress(longPressEnabled)
 				enablePanningAndScalingGestures(panScaleEnabled)
 				setOverrideVolumeButtons(overrideVolumeButtons)
+				disableScrollDeadzone(scrollDeadzoneDisabled)
 				try {
 					setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue))
 				} 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 scrollDeadzoneDisabled = false
+
 	private var nextDownIsDoubleTap = false
 	private var dragInProgress = false
 	private var scaleInProgress = false
@@ -153,7 +155,7 @@ internal class GodotGestureHandler(private val inputHandler: GodotInputHandler)
 		if (contextClickInProgress) {
 			inputHandler.handleMouseEvent(event, event.actionMasked, MotionEvent.BUTTON_SECONDARY, false)
 			return true
-		} else if (!scaleInProgress) {
+		} else if (scrollDeadzoneDisabled && !scaleInProgress) {
 			// The 'onScroll' event is triggered with a long delay.
 			// Force the 'InputEventScreenDrag' event earlier here.
 			// 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
 	): Boolean {
 		if (scaleInProgress) {
-			if (dragInProgress || lastDragX != 0.0f || lastDragY != 0.0f) {
+			if (dragInProgress || (scrollDeadzoneDisabled && (lastDragX != 0.0f || lastDragY != 0.0f))) {
 				if (originEvent != null) {
 					// Cancel the drag
 					inputHandler.handleMotionEvent(originEvent, MotionEvent.ACTION_CANCEL)

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

@@ -118,6 +118,13 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
 		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.
 	 * <p>