From 4e3b267c4d44df4c1e375fc7f9e0624655341c6b Mon Sep 17 00:00:00 2001 From: SSimco <37044560+SSimco@users.noreply.github.com> Date: Tue, 15 Oct 2024 21:20:19 +0300 Subject: [PATCH] Refactored input java code --- src/android/app/src/main/cpp/JNIUtils.h | 12 ++--- .../Cemu/drawable/DrawableExtensions.java | 31 +++++++++++++ .../info/cemu/Cemu/inputoverlay/Button.java | 8 ++-- .../cemu/Cemu/inputoverlay/DPadInput.java | 8 ++-- .../info/cemu/Cemu/inputoverlay/Input.java | 6 +-- .../inputoverlay/InputOverlaySurfaceView.java | 29 +++--------- .../info/cemu/Cemu/inputoverlay/Joystick.java | 44 ++++++++++++------- .../Cemu/inputoverlay/RectangleButton.java | 4 +- .../cemu/Cemu/inputoverlay/RoundButton.java | 4 +- .../main/res/drawable/button_a_pressed.xml | 16 ------- .../main/res/drawable/button_b_pressed.xml | 16 ------- .../main/res/drawable/button_c_pressed.xml | 16 ------- .../main/res/drawable/button_home_pressed.xml | 16 ------- .../main/res/drawable/button_l_pressed.xml | 15 ------- .../res/drawable/button_minus_pressed.xml | 16 ------- .../main/res/drawable/button_one_pressed.xml | 16 ------- .../main/res/drawable/button_plus_pressed.xml | 16 ------- .../main/res/drawable/button_r_pressed.xml | 15 ------- .../res/drawable/button_stick_pressed.xml | 22 ---------- .../main/res/drawable/button_two_pressed.xml | 16 ------- .../main/res/drawable/button_x_pressed.xml | 16 ------- .../main/res/drawable/button_y_pressed.xml | 16 ------- .../main/res/drawable/button_z_pressed.xml | 16 ------- .../main/res/drawable/button_zl_pressed.xml | 15 ------- .../main/res/drawable/button_zr_pressed.xml | 15 ------- .../main/res/drawable/dpad_button_pressed.xml | 11 ----- .../main/res/drawable/stick_inner_pressed.xml | 12 ----- 27 files changed, 87 insertions(+), 340 deletions(-) create mode 100644 src/android/app/src/main/java/info/cemu/Cemu/drawable/DrawableExtensions.java delete mode 100644 src/android/app/src/main/res/drawable/button_a_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_b_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_c_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_home_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_l_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_minus_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_one_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_plus_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_r_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_stick_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_two_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_x_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_y_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_z_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_zl_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/button_zr_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/dpad_button_pressed.xml delete mode 100644 src/android/app/src/main/res/drawable/stick_inner_pressed.xml diff --git a/src/android/app/src/main/cpp/JNIUtils.h b/src/android/app/src/main/cpp/JNIUtils.h index 4c966978..63f4108d 100644 --- a/src/android/app/src/main/cpp/JNIUtils.h +++ b/src/android/app/src/main/cpp/JNIUtils.h @@ -59,7 +59,7 @@ namespace JNIUtils public: Scopedjobject() = default; - Scopedjobject(Scopedjobject&& other) + Scopedjobject(Scopedjobject&& other) noexcept { this->m_jobject = other.m_jobject; other.m_jobject = nullptr; @@ -72,7 +72,7 @@ namespace JNIUtils m_jobject = nullptr; } } - Scopedjobject& operator=(Scopedjobject&& other) + Scopedjobject& operator=(Scopedjobject&& other) noexcept { if (this != &other) { @@ -87,7 +87,7 @@ namespace JNIUtils return m_jobject; } - Scopedjobject(jobject obj) + explicit Scopedjobject(jobject obj) { if (obj) m_jobject = ScopedJNIENV()->NewGlobalRef(obj); @@ -112,13 +112,13 @@ namespace JNIUtils public: Scopedjclass() = default; - Scopedjclass(Scopedjclass&& other) + Scopedjclass(Scopedjclass&& other) noexcept { this->m_jclass = other.m_jclass; other.m_jclass = nullptr; } - Scopedjclass& operator=(Scopedjclass&& other) + Scopedjclass& operator=(Scopedjclass&& other) noexcept { if (this != &other) { @@ -130,7 +130,7 @@ namespace JNIUtils return *this; } - Scopedjclass(const std::string& className) + explicit Scopedjclass(const std::string& className) { ScopedJNIENV scopedEnv; jobject tempObj = scopedEnv->FindClass(className.c_str()); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/drawable/DrawableExtensions.java b/src/android/app/src/main/java/info/cemu/Cemu/drawable/DrawableExtensions.java new file mode 100644 index 00000000..4d66c19b --- /dev/null +++ b/src/android/app/src/main/java/info/cemu/Cemu/drawable/DrawableExtensions.java @@ -0,0 +1,31 @@ +package info.cemu.Cemu.drawable; + +import android.content.res.Resources; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.drawable.Drawable; + +import java.util.Objects; + +public class DrawableExtensions { + private static final ColorMatrix INVERTED_COLOR_MATRIX = new ColorMatrix( + new float[]{ + -1, 0, 0, 0, 255, + 0, -1, 0, 0, 255, + 0, 0, -1, 0, 255, + 0, 0, 0, 1, 0 + } + ); + + public static Drawable getInvertedDrawable(Drawable drawable, Resources resources) { + var newDrawable = Objects.requireNonNull(drawable.getConstantState()) + .newDrawable(resources); + return applyInvertedColorTransform(newDrawable); + } + + public static Drawable applyInvertedColorTransform(Drawable drawable) { + drawable = drawable.mutate(); + drawable.setColorFilter(new ColorMatrixColorFilter(INVERTED_COLOR_MATRIX)); + return drawable; + } +} diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java index 2cf26b79..5804f7c1 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java @@ -10,6 +10,8 @@ import androidx.core.content.res.ResourcesCompat; import java.util.Objects; +import info.cemu.Cemu.drawable.DrawableExtensions; + public abstract class Button extends Input { protected Drawable iconPressed; protected Drawable iconNotPressed; @@ -18,11 +20,11 @@ public abstract class Button extends Input { private final ButtonStateChangeListener buttonStateChangeListener; private final InputOverlaySurfaceView.OverlayButton button; - public Button(Resources resources, @DrawableRes int pressedButtonId, @DrawableRes int notPressedButtonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton button, InputOverlaySettingsProvider.InputOverlaySettings settings) { + public Button(Resources resources, @DrawableRes int buttonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton button, InputOverlaySettingsProvider.InputOverlaySettings settings) { super(settings); - iconPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, pressedButtonId, null)); + iconNotPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, buttonId, null)); + iconPressed = DrawableExtensions.getInvertedDrawable(iconNotPressed, resources); iconPressed.setAlpha(settings.getAlpha()); - iconNotPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, notPressedButtonId, null)); iconNotPressed.setAlpha(settings.getAlpha()); icon = iconNotPressed; this.buttonStateChangeListener = buttonStateChangeListener; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java index cfea1d95..38cbee0e 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java @@ -11,6 +11,8 @@ import androidx.core.content.res.ResourcesCompat; import java.util.Objects; import java.util.function.Supplier; +import info.cemu.Cemu.drawable.DrawableExtensions; + public class DPadInput extends Input { Drawable iconDpadUp; Drawable iconDpadUpPressed; @@ -96,14 +98,14 @@ public class DPadInput extends Input { ); } - public DPadInput(Resources resources, @DrawableRes int backgroundId, @DrawableRes int pressedButtonId, @DrawableRes int notPressedButtonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySettingsProvider.InputOverlaySettings settings) { + public DPadInput(Resources resources, @DrawableRes int backgroundId, @DrawableRes int buttonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySettingsProvider.InputOverlaySettings settings) { super(settings); this.buttonStateChangeListener = buttonStateChangeListener; background = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, backgroundId, null)); - Supplier getPressedButtonIcon = () -> Objects.requireNonNull(ResourcesCompat.getDrawable(resources, pressedButtonId, null)); - Supplier getNotPressedButtonIcon = () -> Objects.requireNonNull(ResourcesCompat.getDrawable(resources, notPressedButtonId, null)); + Supplier getNotPressedButtonIcon = () -> Objects.requireNonNull(ResourcesCompat.getDrawable(resources, buttonId, null)); + Supplier getPressedButtonIcon = () -> DrawableExtensions.applyInvertedColorTransform(ResourcesCompat.getDrawable(resources, buttonId, null)); iconDpadUpPressed = getPressedButtonIcon.get(); iconDpadUpNotPressed = getNotPressedButtonIcon.get(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java index 8ea980c3..0ea22d9c 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java @@ -36,13 +36,11 @@ public abstract class Input { configure(); } - private static final float MIN_WIDTH_HEIGHT = 100; - - public void resize(int diffX, int diffY, int maxWidth, int maxHeight) { + public void resize(int diffX, int diffY, int maxWidth, int maxHeight, int minWidthHeight) { var rect = settings.getRect(); int newRight = rect.right + diffX; int newBottom = rect.bottom + diffY; - if (newRight - rect.left < MIN_WIDTH_HEIGHT || newBottom - rect.top < MIN_WIDTH_HEIGHT + if (newRight - rect.left < minWidthHeight || newBottom - rect.top < minWidthHeight || newRight > maxWidth || newBottom > maxHeight) { return; } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java index 20304f2b..c590124e 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java @@ -5,6 +5,7 @@ import android.graphics.Canvas; import android.os.VibrationEffect; import android.os.Vibrator; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; @@ -45,13 +46,11 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch return; } if (this.inputMode != InputMode.DEFAULT) { - for (var input : inputs) { - input.saveConfiguration(); - } return; } for (var input : inputs) { input.reset(); + input.saveConfiguration(); } } @@ -97,10 +96,13 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch private final Vibrator vibrator; private final VibrationEffect buttonTouchVibrationEffect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK); private final boolean vibrateOnTouch; + private static final int INPUTS_MIN_WIDTH_HEIGHT_DP = 40; + private final int inputsMinWidthHeight; public InputOverlaySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); context.getSystemService(Context.VIBRATOR_SERVICE); + inputsMinWidthHeight = Math.round(INPUTS_MIN_WIDTH_HEIGHT_DP * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT)); vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); setOnTouchListener(this); settingsProvider = new InputOverlaySettingsProvider(context); @@ -311,7 +313,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch inputs.add(new RoundButton( resources, - R.drawable.button_a_pressed, R.drawable.button_a, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.A, @@ -319,7 +320,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_b_pressed, R.drawable.button_b, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.B, @@ -329,7 +329,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch if (nativeControllerType != NativeInput.EMULATED_CONTROLLER_TYPE_WIIMOTE) { inputs.add(new RoundButton( resources, - R.drawable.button_x_pressed, R.drawable.button_x, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.X, @@ -337,7 +336,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_y_pressed, R.drawable.button_y, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.Y, @@ -345,7 +343,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RectangleButton( resources, - R.drawable.button_zl_pressed, R.drawable.button_zl, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.ZL, @@ -353,7 +350,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RectangleButton( resources, - R.drawable.button_l_pressed, R.drawable.button_l, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.L, @@ -361,7 +357,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RectangleButton( resources, - R.drawable.button_zr_pressed, R.drawable.button_zr, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.ZR, @@ -369,7 +364,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RectangleButton( resources, - R.drawable.button_r_pressed, R.drawable.button_r, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.R, @@ -378,7 +372,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch inputs.add(new Joystick( resources, R.drawable.stick_background, - R.drawable.stick_inner_pressed, R.drawable.stick_inner, InputOverlaySurfaceView.this::onJoystickStateChange, OverlayJoystick.RIGHT, @@ -388,7 +381,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch inputs.add(new RoundButton( resources, - R.drawable.button_minus_pressed, R.drawable.button_minus, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.MINUS, @@ -396,7 +388,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_plus_pressed, R.drawable.button_plus, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.PLUS, @@ -406,7 +397,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch inputs.add(new DPadInput( resources, R.drawable.dpad_background, - R.drawable.dpad_button_pressed, R.drawable.dpad_button, InputOverlaySurfaceView.this::onButtonStateChange, getOverlaySettingsForInput(InputOverlaySettingsProvider.Input.DPAD) @@ -414,7 +404,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch inputs.add(new Joystick( resources, R.drawable.stick_background, - R.drawable.stick_inner_pressed, R.drawable.stick_inner, InputOverlaySurfaceView.this::onJoystickStateChange, OverlayJoystick.LEFT, @@ -424,7 +413,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch if (nativeControllerType == NativeInput.EMULATED_CONTROLLER_TYPE_WIIMOTE) { inputs.add(new RoundButton( resources, - R.drawable.button_c_pressed, R.drawable.button_c, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.C, @@ -432,7 +420,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_z_pressed, R.drawable.button_z, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.Z, @@ -440,7 +427,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_home_pressed, R.drawable.button_home, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.HOME, @@ -451,7 +437,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch && nativeControllerType != NativeInput.EMULATED_CONTROLLER_TYPE_WIIMOTE) { inputs.add(new RoundButton( resources, - R.drawable.button_stick_pressed, R.drawable.button_stick, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.L_STICK, @@ -459,7 +444,6 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch )); inputs.add(new RoundButton( resources, - R.drawable.button_stick_pressed, R.drawable.button_stick, InputOverlaySurfaceView.this::onButtonStateChange, OverlayButton.R_STICK, @@ -550,7 +534,8 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch (int) (x2 - x1), (int) (y2 - y1), getWidth(), - getHeight()); + getHeight(), + inputsMinWidthHeight); } return true; } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java index 3539a97f..4391fc0d 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java @@ -10,14 +10,18 @@ import androidx.core.content.res.ResourcesCompat; import java.util.Objects; +import info.cemu.Cemu.drawable.DrawableExtensions; + public class Joystick extends Input { private final Drawable iconPressed; private final Drawable iconNotPressed; private final Drawable joystickBackground; private Drawable icon; private int currentPointerId = -1; - private int centreX = 0; - private int centreY = 0; + private int centerX = 0; + private int centerY = 0; + private int originalCenterX = 0; + private int originalCenterY = 0; private int radius = 0; private int innerRadius = 0; @@ -28,11 +32,11 @@ public class Joystick extends Input { private final StickStateChangeListener stickStateChangeListener; private final InputOverlaySurfaceView.OverlayJoystick joystick; - public Joystick(Resources resources, @DrawableRes int joystickBackgroundId, @DrawableRes int pressedStickId, @DrawableRes int notPressedStickId, StickStateChangeListener stickStateChangeListener, InputOverlaySurfaceView.OverlayJoystick joystick, InputOverlaySettingsProvider.InputOverlaySettings settings) { + public Joystick(Resources resources, @DrawableRes int joystickBackgroundId, @DrawableRes int innerStickId, StickStateChangeListener stickStateChangeListener, InputOverlaySurfaceView.OverlayJoystick joystick, InputOverlaySettingsProvider.InputOverlaySettings settings) { super(settings); joystickBackground = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, joystickBackgroundId, null)); - iconPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, pressedStickId, null)); - iconNotPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, notPressedStickId, null)); + iconNotPressed = Objects.requireNonNull(ResourcesCompat.getDrawable(resources, innerStickId, null)); + iconPressed = DrawableExtensions.getInvertedDrawable(iconNotPressed, resources); icon = iconNotPressed; this.stickStateChangeListener = stickStateChangeListener; this.joystick = joystick; @@ -46,24 +50,24 @@ public class Joystick extends Input { icon = iconNotPressed; } stickStateChangeListener.onStickStateChange(joystick, x, y); - int newCentreX = (int) (centreX + radius * x); - int newCentreY = (int) (centreY + radius * y); + int newCentreX = (int) (centerX + radius * x); + int newCentreY = (int) (centerY + radius * y); iconPressed.setBounds(newCentreX - innerRadius, newCentreY - innerRadius, newCentreX + innerRadius, newCentreY + innerRadius); } @Override protected void configure() { - var rect = settings.getRect(); - this.centreX = rect.centerX(); - this.centreY = rect.centerY(); - this.radius = Math.min(rect.width(), rect.height()) / 2; + var joystickBounds = settings.getRect(); + this.originalCenterX = this.centerX = joystickBounds.centerX(); + this.originalCenterY = this.centerY = joystickBounds.centerY(); + this.radius = Math.min(joystickBounds.width(), joystickBounds.height()) / 2; this.innerRadius = (int) (radius * 0.65f); - joystickBackground.setBounds(centreX - radius, centreY - radius, centreX + radius, centreY + radius); + joystickBackground.setBounds(centerX - radius, centerY - radius, centerX + radius, centerY + radius); joystickBackground.setAlpha(settings.getAlpha()); iconPressed.setAlpha(settings.getAlpha()); - iconPressed.setBounds(centreX - innerRadius, centreY - innerRadius, centreX + innerRadius, centreY + innerRadius); + iconPressed.setBounds(centerX - innerRadius, centerY - innerRadius, centerX + innerRadius, centerY + innerRadius); iconNotPressed.setAlpha(settings.getAlpha()); - iconNotPressed.setBounds(centreX - innerRadius, centreY - innerRadius, centreX + innerRadius, centreY + innerRadius); + iconNotPressed.setBounds(centerX - innerRadius, centerY - innerRadius, centerX + innerRadius, centerY + innerRadius); } @Override @@ -75,6 +79,9 @@ public class Joystick extends Input { int x = (int) event.getX(pointerIndex); int y = (int) event.getY(pointerIndex); if (isInside(x, y)) { + centerX = x; + centerY = y; + joystickBackground.setBounds(centerX - radius, centerY - radius, centerX + radius, centerY + radius); currentPointerId = event.getPointerId(pointerIndex); updateState(true, 0.0f, 0.0f); stateUpdated = true; @@ -82,6 +89,9 @@ public class Joystick extends Input { } case MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> { if (currentPointerId == event.getPointerId(event.getActionIndex())) { + centerX = originalCenterX; + centerY = originalCenterY; + joystickBackground.setBounds(centerX - radius, centerY - radius, centerX + radius, centerY + radius); currentPointerId = -1; updateState(false, 0.0f, 0.0f); stateUpdated = true; @@ -95,8 +105,8 @@ public class Joystick extends Input { if (currentPointerId != event.getPointerId(i)) { continue; } - float x = (event.getX(i) - centreX) / radius; - float y = (event.getY(i) - centreY) / radius; + float x = (event.getX(i) - centerX) / radius; + float y = (event.getY(i) - centerY) / radius; float norm = (float) Math.sqrt(x * x + y * y); if (norm > 1.0f) { x /= norm; @@ -124,7 +134,7 @@ public class Joystick extends Input { @Override public boolean isInside(int x, int y) { - return ((x - centreX) * (x - centreX) + (y - centreY) * (y - centreY)) <= radius * radius; + return ((x - originalCenterX) * (x - originalCenterX) + (y - originalCenterY) * (y - originalCenterY)) <= radius * radius; } } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java index b199d6f7..0ad92779 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java @@ -10,8 +10,8 @@ public class RectangleButton extends Button { int right; int bottom; - public RectangleButton(Resources resources, @DrawableRes int pressedButtonId, @DrawableRes int notPressedButtonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton overlayButton, InputOverlaySettingsProvider.InputOverlaySettings settings) { - super(resources, pressedButtonId, notPressedButtonId, buttonStateChangeListener, overlayButton, settings); + public RectangleButton(Resources resources, @DrawableRes int buttonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton overlayButton, InputOverlaySettingsProvider.InputOverlaySettings settings) { + super(resources, buttonId, buttonStateChangeListener, overlayButton, settings); configure(); } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java index a4bb0f64..576c2d89 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java @@ -10,8 +10,8 @@ public class RoundButton extends Button { int centreY; int radius; - RoundButton(Resources resources, @DrawableRes int pressedButtonId, @DrawableRes int notPressedButtonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton overlayButton, InputOverlaySettingsProvider.InputOverlaySettings settings) { - super(resources, pressedButtonId, notPressedButtonId, buttonStateChangeListener, overlayButton, settings); + RoundButton(Resources resources, @DrawableRes int buttonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySurfaceView.OverlayButton overlayButton, InputOverlaySettingsProvider.InputOverlaySettings settings) { + super(resources, buttonId, buttonStateChangeListener, overlayButton, settings); configure(); } diff --git a/src/android/app/src/main/res/drawable/button_a_pressed.xml b/src/android/app/src/main/res/drawable/button_a_pressed.xml deleted file mode 100644 index 828399af..00000000 --- a/src/android/app/src/main/res/drawable/button_a_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_b_pressed.xml b/src/android/app/src/main/res/drawable/button_b_pressed.xml deleted file mode 100644 index 4f70709b..00000000 --- a/src/android/app/src/main/res/drawable/button_b_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_c_pressed.xml b/src/android/app/src/main/res/drawable/button_c_pressed.xml deleted file mode 100644 index 6a46d539..00000000 --- a/src/android/app/src/main/res/drawable/button_c_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_home_pressed.xml b/src/android/app/src/main/res/drawable/button_home_pressed.xml deleted file mode 100644 index 3d9f52a6..00000000 --- a/src/android/app/src/main/res/drawable/button_home_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_l_pressed.xml b/src/android/app/src/main/res/drawable/button_l_pressed.xml deleted file mode 100644 index a1e99d4b..00000000 --- a/src/android/app/src/main/res/drawable/button_l_pressed.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_minus_pressed.xml b/src/android/app/src/main/res/drawable/button_minus_pressed.xml deleted file mode 100644 index 6b0f46b7..00000000 --- a/src/android/app/src/main/res/drawable/button_minus_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_one_pressed.xml b/src/android/app/src/main/res/drawable/button_one_pressed.xml deleted file mode 100644 index 372c9688..00000000 --- a/src/android/app/src/main/res/drawable/button_one_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_plus_pressed.xml b/src/android/app/src/main/res/drawable/button_plus_pressed.xml deleted file mode 100644 index e0d72814..00000000 --- a/src/android/app/src/main/res/drawable/button_plus_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_r_pressed.xml b/src/android/app/src/main/res/drawable/button_r_pressed.xml deleted file mode 100644 index 08c958f6..00000000 --- a/src/android/app/src/main/res/drawable/button_r_pressed.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_stick_pressed.xml b/src/android/app/src/main/res/drawable/button_stick_pressed.xml deleted file mode 100644 index 432203b8..00000000 --- a/src/android/app/src/main/res/drawable/button_stick_pressed.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/src/android/app/src/main/res/drawable/button_two_pressed.xml b/src/android/app/src/main/res/drawable/button_two_pressed.xml deleted file mode 100644 index 099f1d47..00000000 --- a/src/android/app/src/main/res/drawable/button_two_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_x_pressed.xml b/src/android/app/src/main/res/drawable/button_x_pressed.xml deleted file mode 100644 index 9b97d645..00000000 --- a/src/android/app/src/main/res/drawable/button_x_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_y_pressed.xml b/src/android/app/src/main/res/drawable/button_y_pressed.xml deleted file mode 100644 index 3ea23f18..00000000 --- a/src/android/app/src/main/res/drawable/button_y_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_z_pressed.xml b/src/android/app/src/main/res/drawable/button_z_pressed.xml deleted file mode 100644 index 7c682cd9..00000000 --- a/src/android/app/src/main/res/drawable/button_z_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_zl_pressed.xml b/src/android/app/src/main/res/drawable/button_zl_pressed.xml deleted file mode 100644 index 3f57b428..00000000 --- a/src/android/app/src/main/res/drawable/button_zl_pressed.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/button_zr_pressed.xml b/src/android/app/src/main/res/drawable/button_zr_pressed.xml deleted file mode 100644 index 44df81d6..00000000 --- a/src/android/app/src/main/res/drawable/button_zr_pressed.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/src/android/app/src/main/res/drawable/dpad_button_pressed.xml b/src/android/app/src/main/res/drawable/dpad_button_pressed.xml deleted file mode 100644 index 186a63f6..00000000 --- a/src/android/app/src/main/res/drawable/dpad_button_pressed.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/android/app/src/main/res/drawable/stick_inner_pressed.xml b/src/android/app/src/main/res/drawable/stick_inner_pressed.xml deleted file mode 100644 index 0c5f7c96..00000000 --- a/src/android/app/src/main/res/drawable/stick_inner_pressed.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -