mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-07-04 23:31:19 +01:00
Merge pull request #10943 from t895/stick-modifiers
android: Input overlay updates
This commit is contained in:
commit
3c88547c74
11 changed files with 751 additions and 170 deletions
|
@ -112,25 +112,36 @@ class Settings {
|
||||||
|
|
||||||
const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown"
|
const val PREF_MEMORY_WARNING_SHOWN = "MemoryWarningShown"
|
||||||
|
|
||||||
const val PREF_OVERLAY_INIT = "OverlayInit"
|
const val PREF_OVERLAY_VERSION = "OverlayVersion"
|
||||||
|
const val PREF_LANDSCAPE_OVERLAY_VERSION = "LandscapeOverlayVersion"
|
||||||
|
const val PREF_PORTRAIT_OVERLAY_VERSION = "PortraitOverlayVersion"
|
||||||
|
const val PREF_FOLDABLE_OVERLAY_VERSION = "FoldableOverlayVersion"
|
||||||
|
val overlayLayoutPrefs = listOf(
|
||||||
|
PREF_LANDSCAPE_OVERLAY_VERSION,
|
||||||
|
PREF_PORTRAIT_OVERLAY_VERSION,
|
||||||
|
PREF_FOLDABLE_OVERLAY_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
const val PREF_CONTROL_SCALE = "controlScale"
|
const val PREF_CONTROL_SCALE = "controlScale"
|
||||||
const val PREF_CONTROL_OPACITY = "controlOpacity"
|
const val PREF_CONTROL_OPACITY = "controlOpacity"
|
||||||
const val PREF_TOUCH_ENABLED = "isTouchEnabled"
|
const val PREF_TOUCH_ENABLED = "isTouchEnabled"
|
||||||
const val PREF_BUTTON_TOGGLE_0 = "buttonToggle0"
|
const val PREF_BUTTON_A = "buttonToggle0"
|
||||||
const val PREF_BUTTON_TOGGLE_1 = "buttonToggle1"
|
const val PREF_BUTTON_B = "buttonToggle1"
|
||||||
const val PREF_BUTTON_TOGGLE_2 = "buttonToggle2"
|
const val PREF_BUTTON_X = "buttonToggle2"
|
||||||
const val PREF_BUTTON_TOGGLE_3 = "buttonToggle3"
|
const val PREF_BUTTON_Y = "buttonToggle3"
|
||||||
const val PREF_BUTTON_TOGGLE_4 = "buttonToggle4"
|
const val PREF_BUTTON_L = "buttonToggle4"
|
||||||
const val PREF_BUTTON_TOGGLE_5 = "buttonToggle5"
|
const val PREF_BUTTON_R = "buttonToggle5"
|
||||||
const val PREF_BUTTON_TOGGLE_6 = "buttonToggle6"
|
const val PREF_BUTTON_ZL = "buttonToggle6"
|
||||||
const val PREF_BUTTON_TOGGLE_7 = "buttonToggle7"
|
const val PREF_BUTTON_ZR = "buttonToggle7"
|
||||||
const val PREF_BUTTON_TOGGLE_8 = "buttonToggle8"
|
const val PREF_BUTTON_PLUS = "buttonToggle8"
|
||||||
const val PREF_BUTTON_TOGGLE_9 = "buttonToggle9"
|
const val PREF_BUTTON_MINUS = "buttonToggle9"
|
||||||
const val PREF_BUTTON_TOGGLE_10 = "buttonToggle10"
|
const val PREF_BUTTON_DPAD = "buttonToggle10"
|
||||||
const val PREF_BUTTON_TOGGLE_11 = "buttonToggle11"
|
const val PREF_STICK_L = "buttonToggle11"
|
||||||
const val PREF_BUTTON_TOGGLE_12 = "buttonToggle12"
|
const val PREF_STICK_R = "buttonToggle12"
|
||||||
const val PREF_BUTTON_TOGGLE_13 = "buttonToggle13"
|
const val PREF_BUTTON_STICK_L = "buttonToggle13"
|
||||||
const val PREF_BUTTON_TOGGLE_14 = "buttonToggle14"
|
const val PREF_BUTTON_STICK_R = "buttonToggle14"
|
||||||
|
const val PREF_BUTTON_HOME = "buttonToggle15"
|
||||||
|
const val PREF_BUTTON_SCREENSHOT = "buttonToggle16"
|
||||||
|
|
||||||
const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
|
const val PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER = "EmulationMenuSettings_JoystickRelCenter"
|
||||||
const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
|
const val PREF_MENU_SETTINGS_DPAD_SLIDE = "EmulationMenuSettings_DpadSlideEnable"
|
||||||
|
@ -145,6 +156,30 @@ class Settings {
|
||||||
|
|
||||||
private val configFileSectionsMap: MutableMap<String, List<String>> = HashMap()
|
private val configFileSectionsMap: MutableMap<String, List<String>> = HashMap()
|
||||||
|
|
||||||
|
val overlayPreferences = listOf(
|
||||||
|
PREF_OVERLAY_VERSION,
|
||||||
|
PREF_CONTROL_SCALE,
|
||||||
|
PREF_CONTROL_OPACITY,
|
||||||
|
PREF_TOUCH_ENABLED,
|
||||||
|
PREF_BUTTON_A,
|
||||||
|
PREF_BUTTON_B,
|
||||||
|
PREF_BUTTON_X,
|
||||||
|
PREF_BUTTON_Y,
|
||||||
|
PREF_BUTTON_L,
|
||||||
|
PREF_BUTTON_R,
|
||||||
|
PREF_BUTTON_ZL,
|
||||||
|
PREF_BUTTON_ZR,
|
||||||
|
PREF_BUTTON_PLUS,
|
||||||
|
PREF_BUTTON_MINUS,
|
||||||
|
PREF_BUTTON_DPAD,
|
||||||
|
PREF_STICK_L,
|
||||||
|
PREF_STICK_R,
|
||||||
|
PREF_BUTTON_HOME,
|
||||||
|
PREF_BUTTON_SCREENSHOT,
|
||||||
|
PREF_BUTTON_STICK_L,
|
||||||
|
PREF_BUTTON_STICK_R
|
||||||
|
)
|
||||||
|
|
||||||
const val LayoutOption_Unspecified = 0
|
const val LayoutOption_Unspecified = 0
|
||||||
const val LayoutOption_MobilePortrait = 4
|
const val LayoutOption_MobilePortrait = 4
|
||||||
const val LayoutOption_MobileLandscape = 5
|
const val LayoutOption_MobileLandscape = 5
|
||||||
|
|
|
@ -212,9 +212,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
if (!isInFoldableLayout) {
|
if (!isInFoldableLayout) {
|
||||||
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||||
binding.surfaceInputOverlay.orientation = InputOverlay.PORTRAIT
|
binding.surfaceInputOverlay.layout = InputOverlay.PORTRAIT
|
||||||
} else {
|
} else {
|
||||||
binding.surfaceInputOverlay.orientation = InputOverlay.LANDSCAPE
|
binding.surfaceInputOverlay.layout = InputOverlay.LANDSCAPE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!binding.surfaceInputOverlay.isInEditMode) {
|
if (!binding.surfaceInputOverlay.isInEditMode) {
|
||||||
|
@ -260,7 +260,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
.remove(Settings.PREF_CONTROL_SCALE)
|
.remove(Settings.PREF_CONTROL_SCALE)
|
||||||
.remove(Settings.PREF_CONTROL_OPACITY)
|
.remove(Settings.PREF_CONTROL_OPACITY)
|
||||||
.apply()
|
.apply()
|
||||||
binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.resetButtonPlacement() }
|
binding.surfaceInputOverlay.post {
|
||||||
|
binding.surfaceInputOverlay.resetLayoutVisibilityAndPlacement()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateShowFpsOverlay() {
|
private fun updateShowFpsOverlay() {
|
||||||
|
@ -337,7 +339,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
binding.inGameMenu.layoutParams.height = it.bounds.bottom
|
binding.inGameMenu.layoutParams.height = it.bounds.bottom
|
||||||
|
|
||||||
isInFoldableLayout = true
|
isInFoldableLayout = true
|
||||||
binding.surfaceInputOverlay.orientation = InputOverlay.FOLDABLE
|
binding.surfaceInputOverlay.layout = InputOverlay.FOLDABLE
|
||||||
refreshInputOverlay()
|
refreshInputOverlay()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -410,9 +412,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
R.id.menu_toggle_controls -> {
|
R.id.menu_toggle_controls -> {
|
||||||
val preferences =
|
val preferences =
|
||||||
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
||||||
val optionsArray = BooleanArray(15)
|
val optionsArray = BooleanArray(Settings.overlayPreferences.size)
|
||||||
for (i in 0..14) {
|
Settings.overlayPreferences.forEachIndexed { i, _ ->
|
||||||
optionsArray[i] = preferences.getBoolean("buttonToggle$i", i < 13)
|
optionsArray[i] = preferences.getBoolean("buttonToggle$i", i < 15)
|
||||||
}
|
}
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
val dialog = MaterialAlertDialogBuilder(requireContext())
|
||||||
|
@ -436,7 +438,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
dialog.getButton(AlertDialog.BUTTON_NEUTRAL)
|
dialog.getButton(AlertDialog.BUTTON_NEUTRAL)
|
||||||
.setOnClickListener {
|
.setOnClickListener {
|
||||||
val isChecked = !optionsArray[0]
|
val isChecked = !optionsArray[0]
|
||||||
for (i in 0..14) {
|
Settings.overlayPreferences.forEachIndexed { i, _ ->
|
||||||
optionsArray[i] = isChecked
|
optionsArray[i] = isChecked
|
||||||
dialog.listView.setItemChecked(i, isChecked)
|
dialog.listView.setItemChecked(i, isChecked)
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
|
|
|
@ -51,15 +51,23 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
|
|
||||||
private lateinit var windowInsets: WindowInsets
|
private lateinit var windowInsets: WindowInsets
|
||||||
|
|
||||||
var orientation = LANDSCAPE
|
var layout = LANDSCAPE
|
||||||
|
|
||||||
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||||
super.onLayout(changed, left, top, right, bottom)
|
super.onLayout(changed, left, top, right, bottom)
|
||||||
|
|
||||||
windowInsets = rootWindowInsets
|
windowInsets = rootWindowInsets
|
||||||
|
|
||||||
if (!preferences.getBoolean("${Settings.PREF_OVERLAY_INIT}$orientation", false)) {
|
val overlayVersion = preferences.getInt(Settings.PREF_OVERLAY_VERSION, 0)
|
||||||
defaultOverlay()
|
if (overlayVersion != OVERLAY_VERSION) {
|
||||||
|
resetAllLayouts()
|
||||||
|
} else {
|
||||||
|
val layoutIndex = overlayLayouts.indexOf(layout)
|
||||||
|
val currentLayoutVersion =
|
||||||
|
preferences.getInt(Settings.overlayLayoutPrefs[layoutIndex], 0)
|
||||||
|
if (currentLayoutVersion != overlayLayoutVersions[layoutIndex]) {
|
||||||
|
resetCurrentLayout()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the controls.
|
// Load the controls.
|
||||||
|
@ -266,10 +274,10 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
|
MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
|
||||||
// Persist button position by saving new place.
|
// Persist button position by saving new place.
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
buttonBeingConfigured!!.buttonId,
|
buttonBeingConfigured!!.prefId,
|
||||||
buttonBeingConfigured!!.bounds.centerX(),
|
buttonBeingConfigured!!.bounds.centerX(),
|
||||||
buttonBeingConfigured!!.bounds.centerY(),
|
buttonBeingConfigured!!.bounds.centerY(),
|
||||||
orientation
|
layout
|
||||||
)
|
)
|
||||||
buttonBeingConfigured = null
|
buttonBeingConfigured = null
|
||||||
}
|
}
|
||||||
|
@ -299,10 +307,10 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
|
MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
|
||||||
// Persist button position by saving new place.
|
// Persist button position by saving new place.
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
dpadBeingConfigured!!.upId,
|
Settings.PREF_BUTTON_DPAD,
|
||||||
dpadBeingConfigured!!.bounds.centerX(),
|
dpadBeingConfigured!!.bounds.centerX(),
|
||||||
dpadBeingConfigured!!.bounds.centerY(),
|
dpadBeingConfigured!!.bounds.centerY(),
|
||||||
orientation
|
layout
|
||||||
)
|
)
|
||||||
dpadBeingConfigured = null
|
dpadBeingConfigured = null
|
||||||
}
|
}
|
||||||
|
@ -330,10 +338,10 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
MotionEvent.ACTION_UP,
|
MotionEvent.ACTION_UP,
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
|
MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
joystickBeingConfigured!!.buttonId,
|
joystickBeingConfigured!!.prefId,
|
||||||
joystickBeingConfigured!!.bounds.centerX(),
|
joystickBeingConfigured!!.bounds.centerX(),
|
||||||
joystickBeingConfigured!!.bounds.centerY(),
|
joystickBeingConfigured!!.bounds.centerY(),
|
||||||
orientation
|
layout
|
||||||
)
|
)
|
||||||
joystickBeingConfigured = null
|
joystickBeingConfigured = null
|
||||||
}
|
}
|
||||||
|
@ -343,9 +351,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addOverlayControls(orientation: String) {
|
private fun addOverlayControls(layout: String) {
|
||||||
val windowSize = getSafeScreenSize(context)
|
val windowSize = getSafeScreenSize(context)
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_0, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_A, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -353,11 +361,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_a,
|
R.drawable.facebutton_a,
|
||||||
R.drawable.facebutton_a_depressed,
|
R.drawable.facebutton_a_depressed,
|
||||||
ButtonType.BUTTON_A,
|
ButtonType.BUTTON_A,
|
||||||
orientation
|
Settings.PREF_BUTTON_A,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_1, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_B, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -365,11 +374,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_b,
|
R.drawable.facebutton_b,
|
||||||
R.drawable.facebutton_b_depressed,
|
R.drawable.facebutton_b_depressed,
|
||||||
ButtonType.BUTTON_B,
|
ButtonType.BUTTON_B,
|
||||||
orientation
|
Settings.PREF_BUTTON_B,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_2, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_X, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -377,11 +387,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_x,
|
R.drawable.facebutton_x,
|
||||||
R.drawable.facebutton_x_depressed,
|
R.drawable.facebutton_x_depressed,
|
||||||
ButtonType.BUTTON_X,
|
ButtonType.BUTTON_X,
|
||||||
orientation
|
Settings.PREF_BUTTON_X,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_3, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_Y, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -389,11 +400,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_y,
|
R.drawable.facebutton_y,
|
||||||
R.drawable.facebutton_y_depressed,
|
R.drawable.facebutton_y_depressed,
|
||||||
ButtonType.BUTTON_Y,
|
ButtonType.BUTTON_Y,
|
||||||
orientation
|
Settings.PREF_BUTTON_Y,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_4, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_L, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -401,11 +413,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.l_shoulder,
|
R.drawable.l_shoulder,
|
||||||
R.drawable.l_shoulder_depressed,
|
R.drawable.l_shoulder_depressed,
|
||||||
ButtonType.TRIGGER_L,
|
ButtonType.TRIGGER_L,
|
||||||
orientation
|
Settings.PREF_BUTTON_L,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_5, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_R, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -413,11 +426,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.r_shoulder,
|
R.drawable.r_shoulder,
|
||||||
R.drawable.r_shoulder_depressed,
|
R.drawable.r_shoulder_depressed,
|
||||||
ButtonType.TRIGGER_R,
|
ButtonType.TRIGGER_R,
|
||||||
orientation
|
Settings.PREF_BUTTON_R,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_6, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_ZL, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -425,11 +439,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.zl_trigger,
|
R.drawable.zl_trigger,
|
||||||
R.drawable.zl_trigger_depressed,
|
R.drawable.zl_trigger_depressed,
|
||||||
ButtonType.TRIGGER_ZL,
|
ButtonType.TRIGGER_ZL,
|
||||||
orientation
|
Settings.PREF_BUTTON_ZL,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_7, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_ZR, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -437,11 +452,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.zr_trigger,
|
R.drawable.zr_trigger,
|
||||||
R.drawable.zr_trigger_depressed,
|
R.drawable.zr_trigger_depressed,
|
||||||
ButtonType.TRIGGER_ZR,
|
ButtonType.TRIGGER_ZR,
|
||||||
orientation
|
Settings.PREF_BUTTON_ZR,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_8, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_PLUS, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -449,11 +465,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_plus,
|
R.drawable.facebutton_plus,
|
||||||
R.drawable.facebutton_plus_depressed,
|
R.drawable.facebutton_plus_depressed,
|
||||||
ButtonType.BUTTON_PLUS,
|
ButtonType.BUTTON_PLUS,
|
||||||
orientation
|
Settings.PREF_BUTTON_PLUS,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_9, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_MINUS, true)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -461,11 +478,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_minus,
|
R.drawable.facebutton_minus,
|
||||||
R.drawable.facebutton_minus_depressed,
|
R.drawable.facebutton_minus_depressed,
|
||||||
ButtonType.BUTTON_MINUS,
|
ButtonType.BUTTON_MINUS,
|
||||||
orientation
|
Settings.PREF_BUTTON_MINUS,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_10, true)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_DPAD, true)) {
|
||||||
overlayDpads.add(
|
overlayDpads.add(
|
||||||
initializeOverlayDpad(
|
initializeOverlayDpad(
|
||||||
context,
|
context,
|
||||||
|
@ -473,11 +491,11 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.dpad_standard,
|
R.drawable.dpad_standard,
|
||||||
R.drawable.dpad_standard_cardinal_depressed,
|
R.drawable.dpad_standard_cardinal_depressed,
|
||||||
R.drawable.dpad_standard_diagonal_depressed,
|
R.drawable.dpad_standard_diagonal_depressed,
|
||||||
orientation
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_11, true)) {
|
if (preferences.getBoolean(Settings.PREF_STICK_L, true)) {
|
||||||
overlayJoysticks.add(
|
overlayJoysticks.add(
|
||||||
initializeOverlayJoystick(
|
initializeOverlayJoystick(
|
||||||
context,
|
context,
|
||||||
|
@ -487,11 +505,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.joystick_depressed,
|
R.drawable.joystick_depressed,
|
||||||
StickType.STICK_L,
|
StickType.STICK_L,
|
||||||
ButtonType.STICK_L,
|
ButtonType.STICK_L,
|
||||||
orientation
|
Settings.PREF_STICK_L,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_12, true)) {
|
if (preferences.getBoolean(Settings.PREF_STICK_R, true)) {
|
||||||
overlayJoysticks.add(
|
overlayJoysticks.add(
|
||||||
initializeOverlayJoystick(
|
initializeOverlayJoystick(
|
||||||
context,
|
context,
|
||||||
|
@ -501,11 +520,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.joystick_depressed,
|
R.drawable.joystick_depressed,
|
||||||
StickType.STICK_R,
|
StickType.STICK_R,
|
||||||
ButtonType.STICK_R,
|
ButtonType.STICK_R,
|
||||||
orientation
|
Settings.PREF_STICK_R,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_13, false)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_HOME, false)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -513,11 +533,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_home,
|
R.drawable.facebutton_home,
|
||||||
R.drawable.facebutton_home_depressed,
|
R.drawable.facebutton_home_depressed,
|
||||||
ButtonType.BUTTON_HOME,
|
ButtonType.BUTTON_HOME,
|
||||||
orientation
|
Settings.PREF_BUTTON_HOME,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (preferences.getBoolean(Settings.PREF_BUTTON_TOGGLE_14, false)) {
|
if (preferences.getBoolean(Settings.PREF_BUTTON_SCREENSHOT, false)) {
|
||||||
overlayButtons.add(
|
overlayButtons.add(
|
||||||
initializeOverlayButton(
|
initializeOverlayButton(
|
||||||
context,
|
context,
|
||||||
|
@ -525,7 +546,34 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.drawable.facebutton_screenshot,
|
R.drawable.facebutton_screenshot,
|
||||||
R.drawable.facebutton_screenshot_depressed,
|
R.drawable.facebutton_screenshot_depressed,
|
||||||
ButtonType.BUTTON_CAPTURE,
|
ButtonType.BUTTON_CAPTURE,
|
||||||
orientation
|
Settings.PREF_BUTTON_SCREENSHOT,
|
||||||
|
layout
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (preferences.getBoolean(Settings.PREF_BUTTON_STICK_L, true)) {
|
||||||
|
overlayButtons.add(
|
||||||
|
initializeOverlayButton(
|
||||||
|
context,
|
||||||
|
windowSize,
|
||||||
|
R.drawable.button_l3,
|
||||||
|
R.drawable.button_l3_depressed,
|
||||||
|
ButtonType.STICK_L,
|
||||||
|
Settings.PREF_BUTTON_STICK_L,
|
||||||
|
layout
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (preferences.getBoolean(Settings.PREF_BUTTON_STICK_R, true)) {
|
||||||
|
overlayButtons.add(
|
||||||
|
initializeOverlayButton(
|
||||||
|
context,
|
||||||
|
windowSize,
|
||||||
|
R.drawable.button_r3,
|
||||||
|
R.drawable.button_r3_depressed,
|
||||||
|
ButtonType.STICK_R,
|
||||||
|
Settings.PREF_BUTTON_STICK_R,
|
||||||
|
layout
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -539,18 +587,18 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
|
|
||||||
// Add all the enabled overlay items back to the HashSet.
|
// Add all the enabled overlay items back to the HashSet.
|
||||||
if (EmulationMenuSettings.showOverlay) {
|
if (EmulationMenuSettings.showOverlay) {
|
||||||
addOverlayControls(orientation)
|
addOverlayControls(layout)
|
||||||
}
|
}
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun saveControlPosition(sharedPrefsId: Int, x: Int, y: Int, orientation: String) {
|
private fun saveControlPosition(prefId: String, x: Int, y: Int, layout: String) {
|
||||||
val windowSize = getSafeScreenSize(context)
|
val windowSize = getSafeScreenSize(context)
|
||||||
val min = windowSize.first
|
val min = windowSize.first
|
||||||
val max = windowSize.second
|
val max = windowSize.second
|
||||||
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext).edit()
|
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext).edit()
|
||||||
.putFloat("$sharedPrefsId-X$orientation", (x - min.x).toFloat() / max.x)
|
.putFloat("$prefId-X$layout", (x - min.x).toFloat() / max.x)
|
||||||
.putFloat("$sharedPrefsId-Y$orientation", (y - min.y).toFloat() / max.y)
|
.putFloat("$prefId-Y$layout", (y - min.y).toFloat() / max.y)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,19 +606,31 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
inEditMode = editMode
|
inEditMode = editMode
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun defaultOverlay() {
|
private fun resetCurrentLayout() {
|
||||||
if (!preferences.getBoolean("${Settings.PREF_OVERLAY_INIT}$orientation", false)) {
|
defaultOverlayByLayout(layout)
|
||||||
defaultOverlayByLayout(orientation)
|
val layoutIndex = overlayLayouts.indexOf(layout)
|
||||||
}
|
|
||||||
|
|
||||||
resetButtonPlacement()
|
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
.putBoolean("${Settings.PREF_OVERLAY_INIT}$orientation", true)
|
.putInt(Settings.overlayLayoutPrefs[layoutIndex], overlayLayoutVersions[layoutIndex])
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resetButtonPlacement() {
|
private fun resetAllLayouts() {
|
||||||
defaultOverlayByLayout(orientation)
|
val editor = preferences.edit()
|
||||||
|
overlayLayouts.forEachIndexed { i, layout ->
|
||||||
|
defaultOverlayByLayout(layout)
|
||||||
|
editor.putInt(Settings.overlayLayoutPrefs[i], overlayLayoutVersions[i])
|
||||||
|
}
|
||||||
|
editor.putInt(Settings.PREF_OVERLAY_VERSION, OVERLAY_VERSION)
|
||||||
|
editor.apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resetLayoutVisibilityAndPlacement() {
|
||||||
|
defaultOverlayByLayout(layout)
|
||||||
|
val editor = preferences.edit()
|
||||||
|
Settings.overlayPreferences.forEachIndexed { _, pref ->
|
||||||
|
editor.remove(pref)
|
||||||
|
}
|
||||||
|
editor.apply()
|
||||||
refreshControls()
|
refreshControls()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,7 +664,11 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.integer.SWITCH_STICK_R_X,
|
R.integer.SWITCH_STICK_R_X,
|
||||||
R.integer.SWITCH_STICK_R_Y,
|
R.integer.SWITCH_STICK_R_Y,
|
||||||
R.integer.SWITCH_STICK_L_X,
|
R.integer.SWITCH_STICK_L_X,
|
||||||
R.integer.SWITCH_STICK_L_Y
|
R.integer.SWITCH_STICK_L_Y,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_X,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_Y,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_X,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_Y
|
||||||
)
|
)
|
||||||
|
|
||||||
private val portraitResources = arrayOf(
|
private val portraitResources = arrayOf(
|
||||||
|
@ -637,7 +701,11 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.integer.SWITCH_STICK_R_X_PORTRAIT,
|
R.integer.SWITCH_STICK_R_X_PORTRAIT,
|
||||||
R.integer.SWITCH_STICK_R_Y_PORTRAIT,
|
R.integer.SWITCH_STICK_R_Y_PORTRAIT,
|
||||||
R.integer.SWITCH_STICK_L_X_PORTRAIT,
|
R.integer.SWITCH_STICK_L_X_PORTRAIT,
|
||||||
R.integer.SWITCH_STICK_L_Y_PORTRAIT
|
R.integer.SWITCH_STICK_L_Y_PORTRAIT,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_X_PORTRAIT,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_Y_PORTRAIT,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_X_PORTRAIT,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_Y_PORTRAIT
|
||||||
)
|
)
|
||||||
|
|
||||||
private val foldableResources = arrayOf(
|
private val foldableResources = arrayOf(
|
||||||
|
@ -670,139 +738,159 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
R.integer.SWITCH_STICK_R_X_FOLDABLE,
|
R.integer.SWITCH_STICK_R_X_FOLDABLE,
|
||||||
R.integer.SWITCH_STICK_R_Y_FOLDABLE,
|
R.integer.SWITCH_STICK_R_Y_FOLDABLE,
|
||||||
R.integer.SWITCH_STICK_L_X_FOLDABLE,
|
R.integer.SWITCH_STICK_L_X_FOLDABLE,
|
||||||
R.integer.SWITCH_STICK_L_Y_FOLDABLE
|
R.integer.SWITCH_STICK_L_Y_FOLDABLE,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_X_FOLDABLE,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_L_Y_FOLDABLE,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_X_FOLDABLE,
|
||||||
|
R.integer.SWITCH_BUTTON_STICK_R_Y_FOLDABLE
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun getResourceValue(orientation: String, position: Int): Float {
|
private fun getResourceValue(layout: String, position: Int): Float {
|
||||||
return when (orientation) {
|
return when (layout) {
|
||||||
PORTRAIT -> resources.getInteger(portraitResources[position]).toFloat() / 1000
|
PORTRAIT -> resources.getInteger(portraitResources[position]).toFloat() / 1000
|
||||||
FOLDABLE -> resources.getInteger(foldableResources[position]).toFloat() / 1000
|
FOLDABLE -> resources.getInteger(foldableResources[position]).toFloat() / 1000
|
||||||
else -> resources.getInteger(landscapeResources[position]).toFloat() / 1000
|
else -> resources.getInteger(landscapeResources[position]).toFloat() / 1000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun defaultOverlayByLayout(orientation: String) {
|
private fun defaultOverlayByLayout(layout: String) {
|
||||||
// Each value represents the position of the button in relation to the screen size without insets.
|
// Each value represents the position of the button in relation to the screen size without insets.
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_A.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_A}-X$layout",
|
||||||
getResourceValue(orientation, 0)
|
getResourceValue(layout, 0)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_A.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_A}-Y$layout",
|
||||||
getResourceValue(orientation, 1)
|
getResourceValue(layout, 1)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_B.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_B}-X$layout",
|
||||||
getResourceValue(orientation, 2)
|
getResourceValue(layout, 2)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_B.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_B}-Y$layout",
|
||||||
getResourceValue(orientation, 3)
|
getResourceValue(layout, 3)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_X.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_X}-X$layout",
|
||||||
getResourceValue(orientation, 4)
|
getResourceValue(layout, 4)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_X.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_X}-Y$layout",
|
||||||
getResourceValue(orientation, 5)
|
getResourceValue(layout, 5)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_Y.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_Y}-X$layout",
|
||||||
getResourceValue(orientation, 6)
|
getResourceValue(layout, 6)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_Y.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_Y}-Y$layout",
|
||||||
getResourceValue(orientation, 7)
|
getResourceValue(layout, 7)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_ZL.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_ZL}-X$layout",
|
||||||
getResourceValue(orientation, 8)
|
getResourceValue(layout, 8)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_ZL.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_ZL}-Y$layout",
|
||||||
getResourceValue(orientation, 9)
|
getResourceValue(layout, 9)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_ZR.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_ZR}-X$layout",
|
||||||
getResourceValue(orientation, 10)
|
getResourceValue(layout, 10)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_ZR.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_ZR}-Y$layout",
|
||||||
getResourceValue(orientation, 11)
|
getResourceValue(layout, 11)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.DPAD_UP.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_DPAD}-X$layout",
|
||||||
getResourceValue(orientation, 12)
|
getResourceValue(layout, 12)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.DPAD_UP.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_DPAD}-Y$layout",
|
||||||
getResourceValue(orientation, 13)
|
getResourceValue(layout, 13)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_L.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_L}-X$layout",
|
||||||
getResourceValue(orientation, 14)
|
getResourceValue(layout, 14)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_L.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_L}-Y$layout",
|
||||||
getResourceValue(orientation, 15)
|
getResourceValue(layout, 15)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_R.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_R}-X$layout",
|
||||||
getResourceValue(orientation, 16)
|
getResourceValue(layout, 16)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.TRIGGER_R.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_R}-Y$layout",
|
||||||
getResourceValue(orientation, 17)
|
getResourceValue(layout, 17)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_PLUS.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_PLUS}-X$layout",
|
||||||
getResourceValue(orientation, 18)
|
getResourceValue(layout, 18)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_PLUS.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_PLUS}-Y$layout",
|
||||||
getResourceValue(orientation, 19)
|
getResourceValue(layout, 19)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_MINUS.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_MINUS}-X$layout",
|
||||||
getResourceValue(orientation, 20)
|
getResourceValue(layout, 20)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_MINUS.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_MINUS}-Y$layout",
|
||||||
getResourceValue(orientation, 21)
|
getResourceValue(layout, 21)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_HOME.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_HOME}-X$layout",
|
||||||
getResourceValue(orientation, 22)
|
getResourceValue(layout, 22)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_HOME.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_HOME}-Y$layout",
|
||||||
getResourceValue(orientation, 23)
|
getResourceValue(layout, 23)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_CAPTURE.toString() + "-X$orientation",
|
"${Settings.PREF_BUTTON_SCREENSHOT}-X$layout",
|
||||||
getResourceValue(orientation, 24)
|
getResourceValue(layout, 24)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.BUTTON_CAPTURE.toString() + "-Y$orientation",
|
"${Settings.PREF_BUTTON_SCREENSHOT}-Y$layout",
|
||||||
getResourceValue(orientation, 25)
|
getResourceValue(layout, 25)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.STICK_R.toString() + "-X$orientation",
|
"${Settings.PREF_STICK_R}-X$layout",
|
||||||
getResourceValue(orientation, 26)
|
getResourceValue(layout, 26)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.STICK_R.toString() + "-Y$orientation",
|
"${Settings.PREF_STICK_R}-Y$layout",
|
||||||
getResourceValue(orientation, 27)
|
getResourceValue(layout, 27)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.STICK_L.toString() + "-X$orientation",
|
"${Settings.PREF_STICK_L}-X$layout",
|
||||||
getResourceValue(orientation, 28)
|
getResourceValue(layout, 28)
|
||||||
)
|
)
|
||||||
.putFloat(
|
.putFloat(
|
||||||
ButtonType.STICK_L.toString() + "-Y$orientation",
|
"${Settings.PREF_STICK_L}-Y$layout",
|
||||||
getResourceValue(orientation, 29)
|
getResourceValue(layout, 29)
|
||||||
|
)
|
||||||
|
.putFloat(
|
||||||
|
"${Settings.PREF_BUTTON_STICK_L}-X$layout",
|
||||||
|
getResourceValue(layout, 30)
|
||||||
|
)
|
||||||
|
.putFloat(
|
||||||
|
"${Settings.PREF_BUTTON_STICK_L}-Y$layout",
|
||||||
|
getResourceValue(layout, 31)
|
||||||
|
)
|
||||||
|
.putFloat(
|
||||||
|
"${Settings.PREF_BUTTON_STICK_R}-X$layout",
|
||||||
|
getResourceValue(layout, 32)
|
||||||
|
)
|
||||||
|
.putFloat(
|
||||||
|
"${Settings.PREF_BUTTON_STICK_R}-Y$layout",
|
||||||
|
getResourceValue(layout, 33)
|
||||||
)
|
)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
@ -812,12 +900,30 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
// Increase this number every time there is a breaking change to every overlay layout
|
||||||
|
const val OVERLAY_VERSION = 1
|
||||||
|
|
||||||
|
// Increase the corresponding layout version number whenever that layout has a breaking change
|
||||||
|
private const val LANDSCAPE_OVERLAY_VERSION = 1
|
||||||
|
private const val PORTRAIT_OVERLAY_VERSION = 1
|
||||||
|
private const val FOLDABLE_OVERLAY_VERSION = 1
|
||||||
|
val overlayLayoutVersions = listOf(
|
||||||
|
LANDSCAPE_OVERLAY_VERSION,
|
||||||
|
PORTRAIT_OVERLAY_VERSION,
|
||||||
|
FOLDABLE_OVERLAY_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
private val preferences: SharedPreferences =
|
private val preferences: SharedPreferences =
|
||||||
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
||||||
|
|
||||||
const val LANDSCAPE = ""
|
const val LANDSCAPE = "_Landscape"
|
||||||
const val PORTRAIT = "_Portrait"
|
const val PORTRAIT = "_Portrait"
|
||||||
const val FOLDABLE = "_Foldable"
|
const val FOLDABLE = "_Foldable"
|
||||||
|
val overlayLayouts = listOf(
|
||||||
|
LANDSCAPE,
|
||||||
|
PORTRAIT,
|
||||||
|
FOLDABLE
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resizes a [Bitmap] by a given scale factor
|
* Resizes a [Bitmap] by a given scale factor
|
||||||
|
@ -948,6 +1054,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
* @param defaultResId The resource ID of the [Drawable] to get the [Bitmap] of (Default State).
|
* @param defaultResId The resource ID of the [Drawable] to get the [Bitmap] of (Default State).
|
||||||
* @param pressedResId The resource ID of the [Drawable] to get the [Bitmap] of (Pressed State).
|
* @param pressedResId The resource ID of the [Drawable] to get the [Bitmap] of (Pressed State).
|
||||||
* @param buttonId Identifier for determining what type of button the initialized InputOverlayDrawableButton represents.
|
* @param buttonId Identifier for determining what type of button the initialized InputOverlayDrawableButton represents.
|
||||||
|
* @param prefId Identifier for determining where a button appears on screen.
|
||||||
|
* @param layout The current screen layout as determined by [LANDSCAPE], [PORTRAIT], or [FOLDABLE].
|
||||||
* @return An [InputOverlayDrawableButton] with the correct drawing bounds set.
|
* @return An [InputOverlayDrawableButton] with the correct drawing bounds set.
|
||||||
*/
|
*/
|
||||||
private fun initializeOverlayButton(
|
private fun initializeOverlayButton(
|
||||||
|
@ -956,7 +1064,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
defaultResId: Int,
|
defaultResId: Int,
|
||||||
pressedResId: Int,
|
pressedResId: Int,
|
||||||
buttonId: Int,
|
buttonId: Int,
|
||||||
orientation: String
|
prefId: String,
|
||||||
|
layout: String
|
||||||
): InputOverlayDrawableButton {
|
): InputOverlayDrawableButton {
|
||||||
// Resources handle for fetching the initial Drawable resource.
|
// Resources handle for fetching the initial Drawable resource.
|
||||||
val res = context.resources
|
val res = context.resources
|
||||||
|
@ -964,17 +1073,20 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
// SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableButton.
|
// SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableButton.
|
||||||
val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
|
||||||
|
|
||||||
// Decide scale based on button ID and user preference
|
// Decide scale based on button preference ID and user preference
|
||||||
var scale: Float = when (buttonId) {
|
var scale: Float = when (prefId) {
|
||||||
ButtonType.BUTTON_HOME,
|
Settings.PREF_BUTTON_HOME,
|
||||||
ButtonType.BUTTON_CAPTURE,
|
Settings.PREF_BUTTON_SCREENSHOT,
|
||||||
ButtonType.BUTTON_PLUS,
|
Settings.PREF_BUTTON_PLUS,
|
||||||
ButtonType.BUTTON_MINUS -> 0.07f
|
Settings.PREF_BUTTON_MINUS -> 0.07f
|
||||||
|
|
||||||
ButtonType.TRIGGER_L,
|
Settings.PREF_BUTTON_L,
|
||||||
ButtonType.TRIGGER_R,
|
Settings.PREF_BUTTON_R,
|
||||||
ButtonType.TRIGGER_ZL,
|
Settings.PREF_BUTTON_ZL,
|
||||||
ButtonType.TRIGGER_ZR -> 0.26f
|
Settings.PREF_BUTTON_ZR -> 0.26f
|
||||||
|
|
||||||
|
Settings.PREF_BUTTON_STICK_L,
|
||||||
|
Settings.PREF_BUTTON_STICK_R -> 0.155f
|
||||||
|
|
||||||
else -> 0.11f
|
else -> 0.11f
|
||||||
}
|
}
|
||||||
|
@ -984,8 +1096,13 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
// Initialize the InputOverlayDrawableButton.
|
// Initialize the InputOverlayDrawableButton.
|
||||||
val defaultStateBitmap = getBitmap(context, defaultResId, scale)
|
val defaultStateBitmap = getBitmap(context, defaultResId, scale)
|
||||||
val pressedStateBitmap = getBitmap(context, pressedResId, scale)
|
val pressedStateBitmap = getBitmap(context, pressedResId, scale)
|
||||||
val overlayDrawable =
|
val overlayDrawable = InputOverlayDrawableButton(
|
||||||
InputOverlayDrawableButton(res, defaultStateBitmap, pressedStateBitmap, buttonId)
|
res,
|
||||||
|
defaultStateBitmap,
|
||||||
|
pressedStateBitmap,
|
||||||
|
buttonId,
|
||||||
|
prefId
|
||||||
|
)
|
||||||
|
|
||||||
// Get the minimum and maximum coordinates of the screen where the button can be placed.
|
// Get the minimum and maximum coordinates of the screen where the button can be placed.
|
||||||
val min = windowSize.first
|
val min = windowSize.first
|
||||||
|
@ -993,8 +1110,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
|
|
||||||
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
|
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
|
||||||
// These were set in the input overlay configuration menu.
|
// These were set in the input overlay configuration menu.
|
||||||
val xKey = "$buttonId-X$orientation"
|
val xKey = "$prefId-X$layout"
|
||||||
val yKey = "$buttonId-Y$orientation"
|
val yKey = "$prefId-Y$layout"
|
||||||
val drawableXPercent = sPrefs.getFloat(xKey, 0f)
|
val drawableXPercent = sPrefs.getFloat(xKey, 0f)
|
||||||
val drawableYPercent = sPrefs.getFloat(yKey, 0f)
|
val drawableYPercent = sPrefs.getFloat(yKey, 0f)
|
||||||
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
||||||
|
@ -1029,7 +1146,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
* @param defaultResId The [Bitmap] resource ID of the default state.
|
* @param defaultResId The [Bitmap] resource ID of the default state.
|
||||||
* @param pressedOneDirectionResId The [Bitmap] resource ID of the pressed state in one direction.
|
* @param pressedOneDirectionResId The [Bitmap] resource ID of the pressed state in one direction.
|
||||||
* @param pressedTwoDirectionsResId The [Bitmap] resource ID of the pressed state in two directions.
|
* @param pressedTwoDirectionsResId The [Bitmap] resource ID of the pressed state in two directions.
|
||||||
* @return the initialized [InputOverlayDrawableDpad]
|
* @param layout The current screen layout as determined by [LANDSCAPE], [PORTRAIT], or [FOLDABLE].
|
||||||
|
* @return The initialized [InputOverlayDrawableDpad]
|
||||||
*/
|
*/
|
||||||
private fun initializeOverlayDpad(
|
private fun initializeOverlayDpad(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -1037,7 +1155,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
defaultResId: Int,
|
defaultResId: Int,
|
||||||
pressedOneDirectionResId: Int,
|
pressedOneDirectionResId: Int,
|
||||||
pressedTwoDirectionsResId: Int,
|
pressedTwoDirectionsResId: Int,
|
||||||
orientation: String
|
layout: String
|
||||||
): InputOverlayDrawableDpad {
|
): InputOverlayDrawableDpad {
|
||||||
// Resources handle for fetching the initial Drawable resource.
|
// Resources handle for fetching the initial Drawable resource.
|
||||||
val res = context.resources
|
val res = context.resources
|
||||||
|
@ -1074,8 +1192,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
|
|
||||||
// The X and Y coordinates of the InputOverlayDrawableDpad on the InputOverlay.
|
// The X and Y coordinates of the InputOverlayDrawableDpad on the InputOverlay.
|
||||||
// These were set in the input overlay configuration menu.
|
// These were set in the input overlay configuration menu.
|
||||||
val drawableXPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}-X$orientation", 0f)
|
val drawableXPercent = sPrefs.getFloat("${Settings.PREF_BUTTON_DPAD}-X$layout", 0f)
|
||||||
val drawableYPercent = sPrefs.getFloat("${ButtonType.DPAD_UP}-Y$orientation", 0f)
|
val drawableYPercent = sPrefs.getFloat("${Settings.PREF_BUTTON_DPAD}-Y$layout", 0f)
|
||||||
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
||||||
val drawableY = (drawableYPercent * max.y + min.y).toInt()
|
val drawableY = (drawableYPercent * max.y + min.y).toInt()
|
||||||
val width = overlayDrawable.width
|
val width = overlayDrawable.width
|
||||||
|
@ -1107,7 +1225,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
* @param pressedResInner Resource ID for the pressed inner image of the joystick.
|
* @param pressedResInner Resource ID for the pressed inner image of the joystick.
|
||||||
* @param joystick Identifier for which joystick this is.
|
* @param joystick Identifier for which joystick this is.
|
||||||
* @param button Identifier for which joystick button this is.
|
* @param button Identifier for which joystick button this is.
|
||||||
* @return the initialized [InputOverlayDrawableJoystick].
|
* @param prefId Identifier for determining where a button appears on screen.
|
||||||
|
* @param layout The current screen layout as determined by [LANDSCAPE], [PORTRAIT], or [FOLDABLE].
|
||||||
|
* @return The initialized [InputOverlayDrawableJoystick].
|
||||||
*/
|
*/
|
||||||
private fun initializeOverlayJoystick(
|
private fun initializeOverlayJoystick(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
@ -1117,7 +1237,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
pressedResInner: Int,
|
pressedResInner: Int,
|
||||||
joystick: Int,
|
joystick: Int,
|
||||||
button: Int,
|
button: Int,
|
||||||
orientation: String
|
prefId: String,
|
||||||
|
layout: String
|
||||||
): InputOverlayDrawableJoystick {
|
): InputOverlayDrawableJoystick {
|
||||||
// Resources handle for fetching the initial Drawable resource.
|
// Resources handle for fetching the initial Drawable resource.
|
||||||
val res = context.resources
|
val res = context.resources
|
||||||
|
@ -1141,8 +1262,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
|
|
||||||
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
|
// The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay.
|
||||||
// These were set in the input overlay configuration menu.
|
// These were set in the input overlay configuration menu.
|
||||||
val drawableXPercent = sPrefs.getFloat("$button-X$orientation", 0f)
|
val drawableXPercent = sPrefs.getFloat("$prefId-X$layout", 0f)
|
||||||
val drawableYPercent = sPrefs.getFloat("$button-Y$orientation", 0f)
|
val drawableYPercent = sPrefs.getFloat("$prefId-Y$layout", 0f)
|
||||||
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
val drawableX = (drawableXPercent * max.x + min.x).toInt()
|
||||||
val drawableY = (drawableYPercent * max.y + min.y).toInt()
|
val drawableY = (drawableYPercent * max.y + min.y).toInt()
|
||||||
val outerScale = 1.66f
|
val outerScale = 1.66f
|
||||||
|
@ -1168,7 +1289,8 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
outerRect,
|
outerRect,
|
||||||
innerRect,
|
innerRect,
|
||||||
joystick,
|
joystick,
|
||||||
button
|
button,
|
||||||
|
prefId
|
||||||
)
|
)
|
||||||
|
|
||||||
// Need to set the image's position
|
// Need to set the image's position
|
||||||
|
|
|
@ -24,7 +24,8 @@ class InputOverlayDrawableButton(
|
||||||
res: Resources,
|
res: Resources,
|
||||||
defaultStateBitmap: Bitmap,
|
defaultStateBitmap: Bitmap,
|
||||||
pressedStateBitmap: Bitmap,
|
pressedStateBitmap: Bitmap,
|
||||||
val buttonId: Int
|
val buttonId: Int,
|
||||||
|
val prefId: String
|
||||||
) {
|
) {
|
||||||
// The ID value what motion event is tracking
|
// The ID value what motion event is tracking
|
||||||
var trackId: Int
|
var trackId: Int
|
||||||
|
|
|
@ -37,7 +37,8 @@ class InputOverlayDrawableJoystick(
|
||||||
rectOuter: Rect,
|
rectOuter: Rect,
|
||||||
rectInner: Rect,
|
rectInner: Rect,
|
||||||
val joystickId: Int,
|
val joystickId: Int,
|
||||||
val buttonId: Int
|
val buttonId: Int,
|
||||||
|
val prefId: String
|
||||||
) {
|
) {
|
||||||
// The ID value what motion event is tracking
|
// The ID value what motion event is tracking
|
||||||
var trackId = -1
|
var trackId = -1
|
||||||
|
|
128
src/android/app/src/main/res/drawable/button_l3.xml
Normal file
128
src/android/app/src/main/res/drawable/button_l3.xml
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="34.963dp"
|
||||||
|
android:height="37.265dp"
|
||||||
|
android:viewportWidth="34.963"
|
||||||
|
android:viewportHeight="37.265">
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="M19.451,19.024A3.498,3.498 0,0 0,21.165 19.508c1.336,0 1.749,-0.852 1.738,-1.49 0,-1.077 -0.982,-1.537 -1.987,-1.537L20.327,16.481L20.327,15.7L20.901,15.7c0.757,0 1.714,-0.392 1.714,-1.302C22.621,13.785 22.224,13.229 21.271,13.229a2.834,2.834 0,0 0,-1.537 0.529l-0.265,-0.757a3.662,3.662 0,0 1,2.008 -0.59c1.513,0 2.201,0.897 2.201,1.834 0,0.794 -0.474,1.466 -1.421,1.807l0,0.024c0.947,0.19 1.714,0.9 1.714,1.976C23.967,19.27 23.017,20.346 21.165,20.346a3.929,3.929 135,0 1,-1.998 -0.529z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="21.568"
|
||||||
|
android:endY="33.938"
|
||||||
|
android:startX="21.568"
|
||||||
|
android:startY="16.14"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="M16.062,9.353 L9.624,3.405A1.963,1.963 0,0 1,10.955 0l12.88,0a1.963,1.963 135,0 1,1.323 3.405L18.726,9.353a1.961,1.961 135,0 1,-2.664 0z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="17.395"
|
||||||
|
android:endY="18.74"
|
||||||
|
android:startX="17.395"
|
||||||
|
android:startY="-1.296"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="m25.79,5.657l0,0a2.09,2.09 45,0 0,0.23 3.262c3.522,2.402 4.762,5.927 4.741,10.52A13.279,13.279 135,0 1,4.206 19.365c0,-4.516 0.931,-7.71 4.374,-10.107a2.098,2.098 0,0 0,0.233 -3.265l0,0a2.101,2.101 135,0 0,-2.646 -0.169C1.433,9.133 -0.266,13.941 0.033,20.233a17.468,17.468 0,0 0,34.925 -0.868c0,-6.006 -1.971,-10.771 -6.585,-13.917a2.088,2.088 45,0 0,-2.582 0.209z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:centerX="17.477"
|
||||||
|
android:centerY="19.92"
|
||||||
|
android:gradientRadius="17.201"
|
||||||
|
android:type="radial">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0.58" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC6C6C6"
|
||||||
|
android:offset="0.84" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.88" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC2C2C2"
|
||||||
|
android:offset="0.91" />
|
||||||
|
<item
|
||||||
|
android:color="#FFB5B5B5"
|
||||||
|
android:offset="0.94" />
|
||||||
|
<item
|
||||||
|
android:color="#FF9E9E9E"
|
||||||
|
android:offset="0.98" />
|
||||||
|
<item
|
||||||
|
android:color="#FF8F8F8F"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="m12.516,12.729l2,0l0,13.822l6.615,0l0,1.68L12.516,28.231Z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="16.829"
|
||||||
|
android:endY="46.882"
|
||||||
|
android:startX="16.829"
|
||||||
|
android:startY="20.479"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
|
@ -0,0 +1,75 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="34.963dp"
|
||||||
|
android:height="37.265dp"
|
||||||
|
android:viewportWidth="34.963"
|
||||||
|
android:viewportHeight="37.265">
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.3"
|
||||||
|
android:fillColor="#151515"
|
||||||
|
android:pathData="M16.062,9.353 L9.624,3.405A1.963,1.963 0,0 1,10.955 0l12.88,0a1.963,1.963 135,0 1,1.323 3.405L18.726,9.353a1.961,1.961 135,0 1,-2.664 0z"
|
||||||
|
android:strokeAlpha="0.3" />
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:fillColor="#151515"
|
||||||
|
android:pathData="m25.79,5.657l0,0a2.09,2.09 45,0 0,0.23 3.262c3.522,2.402 4.762,5.927 4.741,10.52A13.279,13.279 135,0 1,4.206 19.365c0,-4.516 0.931,-7.71 4.374,-10.107a2.098,2.098 0,0 0,0.233 -3.265l0,0a2.101,2.101 135,0 0,-2.646 -0.169C1.433,9.133 -0.266,13.941 0.033,20.233a17.468,17.468 0,0 0,34.925 -0.868c0,-6.006 -1.971,-10.771 -6.585,-13.917a2.088,2.088 45,0 0,-2.582 0.209z"
|
||||||
|
android:strokeAlpha="0.6" />
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:pathData="M19.451,19.024A3.498,3.498 0,0 0,21.165 19.508c1.336,0 1.749,-0.852 1.738,-1.49 0,-1.077 -0.982,-1.537 -1.987,-1.537L20.327,16.481L20.327,15.7L20.901,15.7c0.757,0 1.714,-0.392 1.714,-1.302C22.621,13.785 22.224,13.229 21.271,13.229a2.834,2.834 0,0 0,-1.537 0.529l-0.265,-0.757a3.662,3.662 0,0 1,2.008 -0.59c1.513,0 2.201,0.897 2.201,1.834 0,0.794 -0.474,1.466 -1.421,1.807l0,0.024c0.947,0.19 1.714,0.9 1.714,1.976C23.967,19.27 23.017,20.346 21.165,20.346a3.929,3.929 135,0 1,-1.998 -0.529z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="21.568"
|
||||||
|
android:endY="33.938"
|
||||||
|
android:startX="21.568"
|
||||||
|
android:startY="16.14"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:pathData="m12.516,12.729l2,0l0,13.822l6.615,0l0,1.68L12.516,28.231Z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="16.829"
|
||||||
|
android:endY="46.882"
|
||||||
|
android:startX="16.829"
|
||||||
|
android:startY="20.479"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
128
src/android/app/src/main/res/drawable/button_r3.xml
Normal file
128
src/android/app/src/main/res/drawable/button_r3.xml
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="34.963dp"
|
||||||
|
android:height="37.265dp"
|
||||||
|
android:viewportWidth="34.963"
|
||||||
|
android:viewportHeight="37.265">
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="m10.781,12.65a19.579,19.579 0,0 1,3.596 -0.302c2.003,0 3.294,0.368 4.199,1.185a3.622,3.622 0,0 1,1.14 2.757c0,1.916 -1.206,3.175 -2.733,3.704l0,0.063c1.119,0.386 1.786,1.421 2.117,2.929 0.474,2.024 0.818,3.424 1.119,3.982l-1.924,0c-0.238,-0.407 -0.561,-1.656 -0.968,-3.466 -0.431,-2.003 -1.206,-2.757 -2.91,-2.82l-1.762,0l0,6.286l-1.873,0zM12.654,19.264l1.916,0c2.003,0 3.273,-1.098 3.273,-2.757 0,-1.873 -1.357,-2.691 -3.336,-2.712a7.649,7.649 0,0 0,-1.852 0.172z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="15.506"
|
||||||
|
android:endY="48.977"
|
||||||
|
android:startX="15.506"
|
||||||
|
android:startY="19.659"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="M16.062,9.353 L9.624,3.405A1.963,1.963 0,0 1,10.955 0l12.88,0a1.963,1.963 135,0 1,1.323 3.405L18.726,9.353a1.961,1.961 135,0 1,-2.664 0z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="17.395"
|
||||||
|
android:endY="18.74"
|
||||||
|
android:startX="17.395"
|
||||||
|
android:startY="-1.296"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="m25.79,5.657l0,0a2.09,2.09 45,0 0,0.23 3.262c3.522,2.402 4.762,5.927 4.741,10.52A13.279,13.279 135,0 1,4.206 19.365c0,-4.516 0.931,-7.71 4.374,-10.107a2.098,2.098 0,0 0,0.233 -3.265l0,0a2.101,2.101 135,0 0,-2.646 -0.169C1.433,9.133 -0.266,13.941 0.033,20.233a17.468,17.468 0,0 0,34.925 -0.868c0,-6.006 -1.971,-10.771 -6.585,-13.917a2.088,2.088 45,0 0,-2.582 0.209z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:centerX="17.477"
|
||||||
|
android:centerY="19.92"
|
||||||
|
android:gradientRadius="17.201"
|
||||||
|
android:type="radial">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0.58" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC6C6C6"
|
||||||
|
android:offset="0.84" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.88" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC2C2C2"
|
||||||
|
android:offset="0.91" />
|
||||||
|
<item
|
||||||
|
android:color="#FFB5B5B5"
|
||||||
|
android:offset="0.94" />
|
||||||
|
<item
|
||||||
|
android:color="#FF9E9E9E"
|
||||||
|
android:offset="0.98" />
|
||||||
|
<item
|
||||||
|
android:color="#FF8F8F8F"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.5"
|
||||||
|
android:pathData="M21.832,19.024A3.498,3.498 0,0 0,23.547 19.508c1.336,0 1.749,-0.852 1.738,-1.49 0,-1.077 -0.982,-1.537 -1.987,-1.537L22.708,16.481L22.708,15.7L23.282,15.7c0.757,0 1.714,-0.392 1.714,-1.302C25.002,13.785 24.605,13.229 23.652,13.229a2.834,2.834 0,0 0,-1.537 0.529l-0.265,-0.757a3.662,3.662 0,0 1,2.008 -0.59c1.513,0 2.201,0.897 2.201,1.834 0,0.794 -0.474,1.466 -1.421,1.807l0,0.024c0.947,0.19 1.714,0.9 1.714,1.976C26.349,19.27 25.399,20.346 23.547,20.346a3.929,3.929 135,0 1,-1.998 -0.529z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="23.949"
|
||||||
|
android:endY="33.938"
|
||||||
|
android:startX="23.949"
|
||||||
|
android:startY="16.14"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
|
@ -0,0 +1,75 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="34.963dp"
|
||||||
|
android:height="37.265dp"
|
||||||
|
android:viewportWidth="34.963"
|
||||||
|
android:viewportHeight="37.265">
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.3"
|
||||||
|
android:fillColor="#151515"
|
||||||
|
android:pathData="M16.062,9.353 L9.624,3.405A1.963,1.963 0,0 1,10.955 0l12.88,0a1.963,1.963 135,0 1,1.323 3.405L18.726,9.353a1.961,1.961 135,0 1,-2.664 0z"
|
||||||
|
android:strokeAlpha="0.3" />
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:fillColor="#151515"
|
||||||
|
android:pathData="m25.79,5.657l0,0a2.09,2.09 45,0 0,0.23 3.262c3.522,2.402 4.762,5.927 4.741,10.52A13.279,13.279 135,0 1,4.206 19.365c0,-4.516 0.931,-7.71 4.374,-10.107a2.098,2.098 0,0 0,0.233 -3.265l0,0a2.101,2.101 135,0 0,-2.646 -0.169C1.433,9.133 -0.266,13.941 0.033,20.233a17.468,17.468 0,0 0,34.925 -0.868c0,-6.006 -1.971,-10.771 -6.585,-13.917a2.088,2.088 45,0 0,-2.582 0.209z"
|
||||||
|
android:strokeAlpha="0.6" />
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:pathData="m10.781,12.65a19.579,19.579 0,0 1,3.596 -0.302c2.003,0 3.294,0.368 4.199,1.185a3.622,3.622 0,0 1,1.14 2.757c0,1.916 -1.206,3.175 -2.733,3.704l0,0.063c1.119,0.386 1.786,1.421 2.117,2.929 0.474,2.024 0.818,3.424 1.119,3.982l-1.924,0c-0.238,-0.407 -0.561,-1.656 -0.968,-3.466 -0.431,-2.003 -1.206,-2.757 -2.91,-2.82l-1.762,0l0,6.286l-1.873,0zM12.654,19.264l1.916,0c2.003,0 3.273,-1.098 3.273,-2.757 0,-1.873 -1.357,-2.691 -3.336,-2.712a7.649,7.649 0,0 0,-1.852 0.172z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="15.506"
|
||||||
|
android:endY="48.977"
|
||||||
|
android:startX="15.506"
|
||||||
|
android:startY="19.659"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillAlpha="0.6"
|
||||||
|
android:pathData="M21.832,19.024A3.498,3.498 0,0 0,23.547 19.508c1.336,0 1.749,-0.852 1.738,-1.49 0,-1.077 -0.982,-1.537 -1.987,-1.537L22.708,16.481L22.708,15.7L23.282,15.7c0.757,0 1.714,-0.392 1.714,-1.302C25.002,13.785 24.605,13.229 23.652,13.229a2.834,2.834 0,0 0,-1.537 0.529l-0.265,-0.757a3.662,3.662 0,0 1,2.008 -0.59c1.513,0 2.201,0.897 2.201,1.834 0,0.794 -0.474,1.466 -1.421,1.807l0,0.024c0.947,0.19 1.714,0.9 1.714,1.976C26.349,19.27 25.399,20.346 23.547,20.346a3.929,3.929 135,0 1,-1.998 -0.529z"
|
||||||
|
android:strokeAlpha="0.6">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="23.949"
|
||||||
|
android:endY="33.938"
|
||||||
|
android:startX="23.949"
|
||||||
|
android:startY="16.14"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#FFC3C4C5"
|
||||||
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC5C6C6"
|
||||||
|
android:offset="0.03" />
|
||||||
|
<item
|
||||||
|
android:color="#FFC7C7C7"
|
||||||
|
android:offset="0.19" />
|
||||||
|
<item
|
||||||
|
android:color="#DBB5B5B5"
|
||||||
|
android:offset="0.44" />
|
||||||
|
<item
|
||||||
|
android:color="#7F878787"
|
||||||
|
android:offset="1" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
|
@ -205,6 +205,8 @@
|
||||||
<item>@string/gamepad_d_pad</item>
|
<item>@string/gamepad_d_pad</item>
|
||||||
<item>@string/gamepad_left_stick</item>
|
<item>@string/gamepad_left_stick</item>
|
||||||
<item>@string/gamepad_right_stick</item>
|
<item>@string/gamepad_right_stick</item>
|
||||||
|
<item>L3</item>
|
||||||
|
<item>R3</item>
|
||||||
<item>@string/gamepad_home</item>
|
<item>@string/gamepad_home</item>
|
||||||
<item>@string/gamepad_screenshot</item>
|
<item>@string/gamepad_screenshot</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
|
@ -33,6 +33,10 @@
|
||||||
<integer name="SWITCH_BUTTON_CAPTURE_Y">950</integer>
|
<integer name="SWITCH_BUTTON_CAPTURE_Y">950</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_X">260</integer>
|
<integer name="SWITCH_BUTTON_DPAD_X">260</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_Y">790</integer>
|
<integer name="SWITCH_BUTTON_DPAD_Y">790</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_X">870</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_Y">400</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_X">960</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_Y">430</integer>
|
||||||
|
|
||||||
<!-- Default SWITCH portrait layout -->
|
<!-- Default SWITCH portrait layout -->
|
||||||
<integer name="SWITCH_BUTTON_A_X_PORTRAIT">840</integer>
|
<integer name="SWITCH_BUTTON_A_X_PORTRAIT">840</integer>
|
||||||
|
@ -65,6 +69,10 @@
|
||||||
<integer name="SWITCH_BUTTON_CAPTURE_Y_PORTRAIT">950</integer>
|
<integer name="SWITCH_BUTTON_CAPTURE_Y_PORTRAIT">950</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_X_PORTRAIT">240</integer>
|
<integer name="SWITCH_BUTTON_DPAD_X_PORTRAIT">240</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_Y_PORTRAIT">840</integer>
|
<integer name="SWITCH_BUTTON_DPAD_Y_PORTRAIT">840</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_X_PORTRAIT">730</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_Y_PORTRAIT">510</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_X_PORTRAIT">900</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_Y_PORTRAIT">540</integer>
|
||||||
|
|
||||||
<!-- Default SWITCH foldable layout -->
|
<!-- Default SWITCH foldable layout -->
|
||||||
<integer name="SWITCH_BUTTON_A_X_FOLDABLE">840</integer>
|
<integer name="SWITCH_BUTTON_A_X_FOLDABLE">840</integer>
|
||||||
|
@ -97,5 +105,9 @@
|
||||||
<integer name="SWITCH_BUTTON_CAPTURE_Y_FOLDABLE">470</integer>
|
<integer name="SWITCH_BUTTON_CAPTURE_Y_FOLDABLE">470</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_X_FOLDABLE">240</integer>
|
<integer name="SWITCH_BUTTON_DPAD_X_FOLDABLE">240</integer>
|
||||||
<integer name="SWITCH_BUTTON_DPAD_Y_FOLDABLE">390</integer>
|
<integer name="SWITCH_BUTTON_DPAD_Y_FOLDABLE">390</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_X_FOLDABLE">550</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_L_Y_FOLDABLE">210</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_X_FOLDABLE">550</integer>
|
||||||
|
<integer name="SWITCH_BUTTON_STICK_R_Y_FOLDABLE">280</integer>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue