summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java137
1 files changed, 71 insertions, 66 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
index 881c6de91..76c437cb9 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.java
@@ -15,7 +15,9 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -29,6 +31,8 @@ import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
+import androidx.core.content.ContextCompat;
+
import org.yuzu.yuzu_emu.NativeLibrary;
import org.yuzu.yuzu_emu.NativeLibrary.ButtonType;
import org.yuzu.yuzu_emu.NativeLibrary.StickType;
@@ -103,21 +107,28 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
/**
* Resizes a {@link Bitmap} by a given scale factor
*
- * @param context The current {@link Context}
- * @param bitmap The {@link Bitmap} to scale.
- * @param scale The scale factor for the bitmap.
+ * @param vectorDrawable The {@link Bitmap} to scale.
+ * @param scale The scale factor for the bitmap.
* @return The scaled {@link Bitmap}
*/
- public static Bitmap resizeBitmap(Context context, Bitmap bitmap, float scale) {
- // Determine the button size based on the smaller screen dimension.
- // This makes sure the buttons are the same size in both portrait and landscape.
- DisplayMetrics dm = context.getResources().getDisplayMetrics();
- int minDimension = Math.min(dm.widthPixels, dm.heightPixels);
-
- return Bitmap.createScaledBitmap(bitmap,
- (int) (minDimension * scale),
- (int) (minDimension * scale),
- true);
+ private static Bitmap getBitmap(VectorDrawable vectorDrawable, float scale) {
+ Bitmap bitmap = Bitmap.createBitmap((int) (vectorDrawable.getIntrinsicWidth() * scale),
+ (int) (vectorDrawable.getIntrinsicHeight() * scale), Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ vectorDrawable.draw(canvas);
+ return bitmap;
+ }
+
+ private static Bitmap getBitmap(Context context, int drawableId, float scale) {
+ Drawable drawable = ContextCompat.getDrawable(context, drawableId);
+ if (drawable instanceof BitmapDrawable) {
+ return BitmapFactory.decodeResource(context.getResources(), drawableId);
+ } else if (drawable instanceof VectorDrawable) {
+ return getBitmap((VectorDrawable) drawable, scale);
+ } else {
+ throw new IllegalArgumentException("unsupported drawable type");
+ }
}
/**
@@ -166,16 +177,16 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
case ButtonType.BUTTON_CAPTURE:
case ButtonType.BUTTON_PLUS:
case ButtonType.BUTTON_MINUS:
- scale = 0.08f;
+ scale = 0.35f;
break;
case ButtonType.TRIGGER_L:
case ButtonType.TRIGGER_R:
case ButtonType.TRIGGER_ZL:
case ButtonType.TRIGGER_ZR:
- scale = 0.18f;
+ scale = 0.38f;
break;
default:
- scale = 0.11f;
+ scale = 0.40f;
break;
}
@@ -183,10 +194,8 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
scale /= 100;
// Initialize the InputOverlayDrawableButton.
- final Bitmap defaultStateBitmap =
- resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale);
- final Bitmap pressedStateBitmap =
- resizeBitmap(context, BitmapFactory.decodeResource(res, pressedResId), scale);
+ final Bitmap defaultStateBitmap = getBitmap(context, defaultResId, scale);
+ final Bitmap pressedStateBitmap = getBitmap(context, pressedResId, scale);
final InputOverlayDrawableButton overlayDrawable =
new InputOverlayDrawableButton(res, defaultStateBitmap, pressedStateBitmap, buttonId);
@@ -243,20 +252,17 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
// Decide scale based on button ID and user preference
- float scale = 0.23f;
+ float scale = 0.40f;
scale *= (sPrefs.getInt("controlScale", 50) + 50);
scale /= 100;
// Initialize the InputOverlayDrawableDpad.
- final Bitmap defaultStateBitmap =
- resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale);
- final Bitmap pressedOneDirectionStateBitmap =
- resizeBitmap(context, BitmapFactory.decodeResource(res, pressedOneDirectionResId),
- scale);
- final Bitmap pressedTwoDirectionsStateBitmap =
- resizeBitmap(context, BitmapFactory.decodeResource(res, pressedTwoDirectionsResId),
- scale);
+ final Bitmap defaultStateBitmap = getBitmap(context, defaultResId, scale);
+ final Bitmap pressedOneDirectionStateBitmap = getBitmap(context, pressedOneDirectionResId,
+ scale);
+ final Bitmap pressedTwoDirectionsStateBitmap = getBitmap(context, pressedTwoDirectionsResId,
+ scale);
final InputOverlayDrawableDpad overlayDrawable =
new InputOverlayDrawableDpad(res, defaultStateBitmap,
pressedOneDirectionStateBitmap, pressedTwoDirectionsStateBitmap,
@@ -300,15 +306,14 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
// Decide scale based on user preference
- float scale = 0.275f;
+ float scale = 0.35f;
scale *= (sPrefs.getInt("controlScale", 50) + 50);
scale /= 100;
// Initialize the InputOverlayDrawableJoystick.
- final Bitmap bitmapOuter =
- resizeBitmap(context, BitmapFactory.decodeResource(res, resOuter), scale);
- final Bitmap bitmapInnerDefault = BitmapFactory.decodeResource(res, defaultResInner);
- final Bitmap bitmapInnerPressed = BitmapFactory.decodeResource(res, pressedResInner);
+ final Bitmap bitmapOuter = getBitmap(context, resOuter, scale);
+ final Bitmap bitmapInnerDefault = getBitmap(context, defaultResInner, 1.0f);
+ final Bitmap bitmapInnerPressed = getBitmap(context, pressedResInner, 1.0f);
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
// These were set in the input overlay configuration menu.
@@ -320,7 +325,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
// Now set the bounds for the InputOverlayDrawableJoystick.
// This will dictate where on the screen (and the what the size) the InputOverlayDrawableJoystick will be.
int outerSize = bitmapOuter.getWidth();
- Rect outerRect = new Rect(drawableX, drawableY, drawableX + (int) (outerSize / outerScale), drawableY + (int) (outerSize / outerScale));
+ Rect outerRect = new Rect(drawableX, drawableY, drawableX + outerSize, drawableY + outerSize);
Rect innerRect = new Rect(0, 0, (int) (outerSize / outerScale), (int) (outerSize / outerScale));
// Send the drawableId to the joystick so it can be referenced when saving control position.
@@ -476,68 +481,68 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener,
private void addOverlayControls(String orientation) {
if (mPreferences.getBoolean("buttonToggle0", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_a,
- R.drawable.button_a_pressed, ButtonType.BUTTON_A, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_a,
+ R.drawable.facebutton_a_depressed, ButtonType.BUTTON_A, orientation));
}
if (mPreferences.getBoolean("buttonToggle1", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_b,
- R.drawable.button_b_pressed, ButtonType.BUTTON_B, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_b,
+ R.drawable.facebutton_b_depressed, ButtonType.BUTTON_B, orientation));
}
if (mPreferences.getBoolean("buttonToggle2", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_x,
- R.drawable.button_x_pressed, ButtonType.BUTTON_X, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_x,
+ R.drawable.facebutton_x_depressed, ButtonType.BUTTON_X, orientation));
}
if (mPreferences.getBoolean("buttonToggle3", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_y,
- R.drawable.button_y_pressed, ButtonType.BUTTON_Y, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_y,
+ R.drawable.facebutton_y_depressed, ButtonType.BUTTON_Y, orientation));
}
if (mPreferences.getBoolean("buttonToggle4", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_l,
- R.drawable.button_l_pressed, ButtonType.TRIGGER_L, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.l_shoulder,
+ R.drawable.l_shoulder_depressed, ButtonType.TRIGGER_L, orientation));
}
if (mPreferences.getBoolean("buttonToggle5", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_r,
- R.drawable.button_r_pressed, ButtonType.TRIGGER_R, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.r_shoulder,
+ R.drawable.r_shoulder_depressed, ButtonType.TRIGGER_R, orientation));
}
if (mPreferences.getBoolean("buttonToggle6", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_zl,
- R.drawable.button_zl_pressed, ButtonType.TRIGGER_ZL, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.zl_trigger,
+ R.drawable.zl_trigger_depressed, ButtonType.TRIGGER_ZL, orientation));
}
if (mPreferences.getBoolean("buttonToggle7", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_zr,
- R.drawable.button_zr_pressed, ButtonType.TRIGGER_ZR, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.zr_trigger,
+ R.drawable.zr_trigger_depressed, ButtonType.TRIGGER_ZR, orientation));
}
if (mPreferences.getBoolean("buttonToggle8", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_start,
- R.drawable.button_start_pressed, ButtonType.BUTTON_PLUS, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_plus,
+ R.drawable.facebutton_plus_depressed, ButtonType.BUTTON_PLUS, orientation));
}
if (mPreferences.getBoolean("buttonToggle9", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_select,
- R.drawable.button_select_pressed, ButtonType.BUTTON_MINUS, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_minus,
+ R.drawable.facebutton_minus_depressed, ButtonType.BUTTON_MINUS, orientation));
}
if (mPreferences.getBoolean("buttonToggle10", true)) {
- overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.dpad,
- R.drawable.dpad_pressed_one_direction,
- R.drawable.dpad_pressed_two_directions,
+ overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.dpad_standard,
+ R.drawable.dpad_standard_cardinal_depressed,
+ R.drawable.dpad_standard_diagonal_depressed,
ButtonType.DPAD_UP, ButtonType.DPAD_DOWN,
ButtonType.DPAD_LEFT, ButtonType.DPAD_RIGHT, orientation));
}
if (mPreferences.getBoolean("buttonToggle11", true)) {
- overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.stick_main_range,
- R.drawable.stick_main, R.drawable.stick_main_pressed,
+ overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.joystick_range,
+ R.drawable.joystick, R.drawable.joystick_depressed,
StickType.STICK_L, ButtonType.STICK_L, orientation));
}
if (mPreferences.getBoolean("buttonToggle12", true)) {
- overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.stick_main_range,
- R.drawable.stick_main, R.drawable.stick_main_pressed, StickType.STICK_R, ButtonType.STICK_R, orientation));
+ overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.joystick_range,
+ R.drawable.joystick, R.drawable.joystick_depressed, StickType.STICK_R, ButtonType.STICK_R, orientation));
}
if (mPreferences.getBoolean("buttonToggle13", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_a,
- R.drawable.button_a, ButtonType.BUTTON_HOME, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_home,
+ R.drawable.facebutton_home_depressed, ButtonType.BUTTON_HOME, orientation));
}
if (mPreferences.getBoolean("buttonToggle14", true)) {
- overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_a,
- R.drawable.button_a, ButtonType.BUTTON_CAPTURE, orientation));
+ overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.facebutton_screenshot,
+ R.drawable.facebutton_screenshot_depressed, ButtonType.BUTTON_CAPTURE, orientation));
}
}