diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlJoystickData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlJoystickData.java
index 4ef42908a9..e2d3dc11bf 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlJoystickData.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlJoystickData.java
@@ -4,6 +4,11 @@ public class ControlJoystickData extends ControlData {
/* Whether the joystick can stay forward */
public boolean forwardLock = false;
+ /*
+ * Whether the finger tracking is absolute (joystick jumps to where you touched)
+ * or relative (joystick stays in the center)
+ */
+ public boolean absolute = false;
public ControlJoystickData(){
super();
@@ -12,5 +17,6 @@ public ControlJoystickData(){
public ControlJoystickData(ControlJoystickData properties) {
super(properties);
forwardLock = properties.forwardLock;
+ absolute = properties.absolute;
}
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlJoystick.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlJoystick.java
index 76fb85dc55..e261d0873f 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlJoystick.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/buttons/ControlJoystick.java
@@ -52,7 +52,7 @@ private void init(ControlJoystickData data, ControlLayout layout) {
mControlData = data;
setProperties(preProcessProperties(data, layout));
setDeadzone(35);
- setFixedCenter(false);
+ setFixedCenter(data.absolute);
setAutoReCenterButton(true);
injectBehaviors();
@@ -91,7 +91,10 @@ public void setProperties(ControlData properties, boolean changePos) {
mControlData = (ControlJoystickData) properties;
mControlData.isHideable = true;
ControlInterface.super.setProperties(properties, changePos);
- postDelayed(() -> setForwardLockDistance(mControlData.forwardLock ? (int) Tools.dpToPx(60) : 0), 10);
+ postDelayed(() -> {
+ setForwardLockDistance(mControlData.forwardLock ? (int) Tools.dpToPx(60) : 0);
+ setFixedCenter(mControlData.absolute);
+ }, 10);
}
@Override
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlPopup.java
index 3d799ecbc4..1e215484e3 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlPopup.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlPopup.java
@@ -20,7 +20,6 @@
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
-import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Spinner;
@@ -75,7 +74,7 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, int
};
protected EditText mNameEditText, mWidthEditText, mHeightEditText;
@SuppressLint("UseSwitchCompatOrMaterialCode")
- protected Switch mToggleSwitch, mPassthroughSwitch, mSwipeableSwitch, mForwardLockSwitch;
+ protected Switch mToggleSwitch, mPassthroughSwitch, mSwipeableSwitch, mForwardLockSwitch, mAbsoluteTrackingSwitch;
protected Spinner mOrientationSpinner;
protected TextView[] mKeycodeTextviews = new TextView[4];
protected SeekBar mStrokeWidthSeekbar, mCornerRadiusSeekbar, mAlphaSeekbar;
@@ -274,6 +273,7 @@ public void loadValues(ControlData data) {
mOrientationTextView.setVisibility(GONE);
mOrientationSpinner.setVisibility(GONE);
mForwardLockSwitch.setVisibility(GONE);
+ mAbsoluteTrackingSwitch.setVisibility(GONE);
mNameEditText.setText(data.name);
mWidthEditText.setText(String.valueOf(data.getWidth()));
@@ -351,6 +351,9 @@ public void loadJoystickValues(ControlJoystickData data) {
mForwardLockSwitch.setVisibility(VISIBLE);
mForwardLockSwitch.setChecked(data.forwardLock);
+
+ mAbsoluteTrackingSwitch.setVisibility(VISIBLE);
+ mAbsoluteTrackingSwitch.setChecked(data.absolute);
}
/**
@@ -383,6 +386,7 @@ private void bindLayout() {
mPassthroughSwitch = mScrollView.findViewById(R.id.checkboxPassThrough);
mSwipeableSwitch = mScrollView.findViewById(R.id.checkboxSwipeable);
mForwardLockSwitch = mScrollView.findViewById(R.id.checkboxForwardLock);
+ mAbsoluteTrackingSwitch = mScrollView.findViewById(R.id.checkboxAbsoluteFingerTracking);
mKeycodeSpinners[0] = mScrollView.findViewById(R.id.editMapping_spinner_1);
mKeycodeSpinners[1] = mScrollView.findViewById(R.id.editMapping_spinner_2);
mKeycodeSpinners[2] = mScrollView.findViewById(R.id.editMapping_spinner_3);
@@ -498,6 +502,12 @@ public void afterTextChanged(Editable s) {
((ControlJoystickData) mCurrentlyEditedButton.getProperties()).forwardLock = isChecked;
}
});
+ mAbsoluteTrackingSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (internalChanges) return;
+ if(mCurrentlyEditedButton.getProperties() instanceof ControlJoystickData){
+ ((ControlJoystickData) mCurrentlyEditedButton.getProperties()).absolute = isChecked;
+ }
+ });
mAlphaSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
diff --git a/app_pojavlauncher/src/main/res/layout/dialog_control_button_setting.xml b/app_pojavlauncher/src/main/res/layout/dialog_control_button_setting.xml
index be125fb779..a3185552dd 100644
--- a/app_pojavlauncher/src/main/res/layout/dialog_control_button_setting.xml
+++ b/app_pojavlauncher/src/main/res/layout/dialog_control_button_setting.xml
@@ -330,6 +330,15 @@
app:layout_constraintTop_toBottomOf="@id/checkboxSwipeable"
tools:ignore="UseSwitchCompatOrMaterialXml" />
+
+
+ app:layout_constraintTop_toBottomOf="@id/checkboxAbsoluteFingerTracking" />
diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml
index df01b31098..bc02be55fd 100644
--- a/app_pojavlauncher/src/main/res/values/strings.xml
+++ b/app_pojavlauncher/src/main/res/values/strings.xml
@@ -170,6 +170,7 @@
Mouse pass-thru
Swipeable
Forward lock
+ Absolute finger tracking
The current amount of free RAM (%d) is lower than allocated RAM (%d), which may lead to crashes. Change the allocation if the game crashes.
Memory allocation
Controls how much memory is given to Minecraft.