diff options
| author | 2023-04-04 16:01:54 -0400 | |
|---|---|---|
| committer | 2023-06-03 00:05:50 -0700 | |
| commit | 78f02ab9a62658c3cdc29c61368443b619c770ad (patch) | |
| tree | 59fe12739bfb347fa0a9281589f0370e7c716faa /src/android/app | |
| parent | android: Use apply instead of commit for shared preferences (diff) | |
| download | yuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.tar.gz yuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.tar.xz yuzu-78f02ab9a62658c3cdc29c61368443b619c770ad.zip | |
android: Scale input overlay independently of system display scale
Diffstat (limited to 'src/android/app')
| -rw-r--r-- | src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt | 49 | ||||
| -rw-r--r-- | src/android/app/src/main/res/values/integers.xml | 22 |
2 files changed, 41 insertions, 30 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt index 9b27ff1e3..895d33abf 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt | |||
| @@ -35,6 +35,8 @@ import org.yuzu.yuzu_emu.R | |||
| 35 | import org.yuzu.yuzu_emu.YuzuApplication | 35 | import org.yuzu.yuzu_emu.YuzuApplication |
| 36 | import org.yuzu.yuzu_emu.features.settings.model.Settings | 36 | import org.yuzu.yuzu_emu.features.settings.model.Settings |
| 37 | import org.yuzu.yuzu_emu.utils.EmulationMenuSettings | 37 | import org.yuzu.yuzu_emu.utils.EmulationMenuSettings |
| 38 | import kotlin.math.max | ||
| 39 | import kotlin.math.min | ||
| 38 | 40 | ||
| 39 | /** | 41 | /** |
| 40 | * Draws the interactive input overlay on top of the | 42 | * Draws the interactive input overlay on top of the |
| @@ -769,28 +771,37 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 769 | /** | 771 | /** |
| 770 | * Resizes a [Bitmap] by a given scale factor | 772 | * Resizes a [Bitmap] by a given scale factor |
| 771 | * | 773 | * |
| 772 | * @param vectorDrawable The {@link Bitmap} to scale. | 774 | * @param context Context for getting the vector drawable |
| 773 | * @param scale The scale factor for the bitmap. | 775 | * @param drawableId The ID of the drawable to scale. |
| 774 | * @return The scaled [Bitmap] | 776 | * @param scale The scale factor for the bitmap. |
| 777 | * @return The scaled [Bitmap] | ||
| 775 | */ | 778 | */ |
| 776 | private fun getBitmap(vectorDrawable: VectorDrawable, scale: Float): Bitmap { | 779 | private fun getBitmap(context: Context, drawableId: Int, scale: Float): Bitmap { |
| 780 | val vectorDrawable = ContextCompat.getDrawable(context, drawableId) as VectorDrawable | ||
| 781 | |||
| 777 | val bitmap = Bitmap.createBitmap( | 782 | val bitmap = Bitmap.createBitmap( |
| 778 | (vectorDrawable.intrinsicWidth * scale).toInt(), | 783 | (vectorDrawable.intrinsicWidth * scale).toInt(), |
| 779 | (vectorDrawable.intrinsicHeight * scale).toInt(), | 784 | (vectorDrawable.intrinsicHeight * scale).toInt(), |
| 780 | Bitmap.Config.ARGB_8888 | 785 | Bitmap.Config.ARGB_8888 |
| 781 | ) | 786 | ) |
| 782 | val canvas = Canvas(bitmap) | 787 | |
| 788 | val dm = context.resources.displayMetrics | ||
| 789 | val minScreenDimension = min(dm.widthPixels, dm.heightPixels) | ||
| 790 | |||
| 791 | val maxBitmapDimension = max(bitmap.width, bitmap.height) | ||
| 792 | val bitmapScale = scale * minScreenDimension / maxBitmapDimension | ||
| 793 | |||
| 794 | val scaledBitmap = Bitmap.createScaledBitmap( | ||
| 795 | bitmap, | ||
| 796 | (bitmap.width * bitmapScale).toInt(), | ||
| 797 | (bitmap.height * bitmapScale).toInt(), | ||
| 798 | true | ||
| 799 | ) | ||
| 800 | |||
| 801 | val canvas = Canvas(scaledBitmap) | ||
| 783 | vectorDrawable.setBounds(0, 0, canvas.width, canvas.height) | 802 | vectorDrawable.setBounds(0, 0, canvas.width, canvas.height) |
| 784 | vectorDrawable.draw(canvas) | 803 | vectorDrawable.draw(canvas) |
| 785 | return bitmap | 804 | return scaledBitmap |
| 786 | } | ||
| 787 | |||
| 788 | private fun getBitmap(context: Context, drawableId: Int, scale: Float): Bitmap { | ||
| 789 | return when (val drawable = ContextCompat.getDrawable(context, drawableId)) { | ||
| 790 | is BitmapDrawable -> BitmapFactory.decodeResource(context.resources, drawableId) | ||
| 791 | is VectorDrawable -> getBitmap(drawable, scale) | ||
| 792 | else -> throw IllegalArgumentException("Unsupported drawable type") | ||
| 793 | } | ||
| 794 | } | 805 | } |
| 795 | 806 | ||
| 796 | /** | 807 | /** |
| @@ -845,12 +856,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 845 | ButtonType.BUTTON_HOME, | 856 | ButtonType.BUTTON_HOME, |
| 846 | ButtonType.BUTTON_CAPTURE, | 857 | ButtonType.BUTTON_CAPTURE, |
| 847 | ButtonType.BUTTON_PLUS, | 858 | ButtonType.BUTTON_PLUS, |
| 848 | ButtonType.BUTTON_MINUS -> 0.35f | 859 | ButtonType.BUTTON_MINUS -> 0.07f |
| 849 | ButtonType.TRIGGER_L, | 860 | ButtonType.TRIGGER_L, |
| 850 | ButtonType.TRIGGER_R, | 861 | ButtonType.TRIGGER_R, |
| 851 | ButtonType.TRIGGER_ZL, | 862 | ButtonType.TRIGGER_ZL, |
| 852 | ButtonType.TRIGGER_ZR -> 0.38f | 863 | ButtonType.TRIGGER_ZR -> 0.26f |
| 853 | else -> 0.43f | 864 | else -> 0.11f |
| 854 | } | 865 | } |
| 855 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() | 866 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() |
| 856 | scale /= 100f | 867 | scale /= 100f |
| @@ -910,7 +921,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 910 | val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) | 921 | val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) |
| 911 | 922 | ||
| 912 | // Decide scale based on button ID and user preference | 923 | // Decide scale based on button ID and user preference |
| 913 | var scale = 0.40f | 924 | var scale = 0.25f |
| 914 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() | 925 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() |
| 915 | scale /= 100f | 926 | scale /= 100f |
| 916 | 927 | ||
| @@ -980,7 +991,7 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : SurfaceView(context | |||
| 980 | val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) | 991 | val sPrefs = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) |
| 981 | 992 | ||
| 982 | // Decide scale based on user preference | 993 | // Decide scale based on user preference |
| 983 | var scale = 0.40f | 994 | var scale = 0.3f |
| 984 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() | 995 | scale *= (sPrefs.getInt(Settings.PREF_CONTROL_SCALE, 50) + 50).toFloat() |
| 985 | scale /= 100f | 996 | scale /= 100f |
| 986 | 997 | ||
diff --git a/src/android/app/src/main/res/values/integers.xml b/src/android/app/src/main/res/values/integers.xml index 79b64192f..bc614b81d 100644 --- a/src/android/app/src/main/res/values/integers.xml +++ b/src/android/app/src/main/res/values/integers.xml | |||
| @@ -4,13 +4,13 @@ | |||
| 4 | 4 | ||
| 5 | <!-- Default SWITCH landscape layout --> | 5 | <!-- Default SWITCH landscape layout --> |
| 6 | <integer name="SWITCH_BUTTON_A_X">760</integer> | 6 | <integer name="SWITCH_BUTTON_A_X">760</integer> |
| 7 | <integer name="SWITCH_BUTTON_A_Y">810</integer> | 7 | <integer name="SWITCH_BUTTON_A_Y">790</integer> |
| 8 | <integer name="SWITCH_BUTTON_B_X">710</integer> | 8 | <integer name="SWITCH_BUTTON_B_X">710</integer> |
| 9 | <integer name="SWITCH_BUTTON_B_Y">920</integer> | 9 | <integer name="SWITCH_BUTTON_B_Y">900</integer> |
| 10 | <integer name="SWITCH_BUTTON_X_X">710</integer> | 10 | <integer name="SWITCH_BUTTON_X_X">710</integer> |
| 11 | <integer name="SWITCH_BUTTON_X_Y">700</integer> | 11 | <integer name="SWITCH_BUTTON_X_Y">680</integer> |
| 12 | <integer name="SWITCH_BUTTON_Y_X">660</integer> | 12 | <integer name="SWITCH_BUTTON_Y_X">660</integer> |
| 13 | <integer name="SWITCH_BUTTON_Y_Y">810</integer> | 13 | <integer name="SWITCH_BUTTON_Y_Y">790</integer> |
| 14 | <integer name="SWITCH_STICK_L_X">100</integer> | 14 | <integer name="SWITCH_STICK_L_X">100</integer> |
| 15 | <integer name="SWITCH_STICK_L_Y">670</integer> | 15 | <integer name="SWITCH_STICK_L_Y">670</integer> |
| 16 | <integer name="SWITCH_STICK_R_X">900</integer> | 16 | <integer name="SWITCH_STICK_R_X">900</integer> |
| @@ -24,14 +24,14 @@ | |||
| 24 | <integer name="SWITCH_TRIGGER_ZR_X">930</integer> | 24 | <integer name="SWITCH_TRIGGER_ZR_X">930</integer> |
| 25 | <integer name="SWITCH_TRIGGER_ZR_Y">90</integer> | 25 | <integer name="SWITCH_TRIGGER_ZR_Y">90</integer> |
| 26 | <integer name="SWITCH_BUTTON_MINUS_X">460</integer> | 26 | <integer name="SWITCH_BUTTON_MINUS_X">460</integer> |
| 27 | <integer name="SWITCH_BUTTON_MINUS_Y">955</integer> | 27 | <integer name="SWITCH_BUTTON_MINUS_Y">950</integer> |
| 28 | <integer name="SWITCH_BUTTON_PLUS_X">540</integer> | 28 | <integer name="SWITCH_BUTTON_PLUS_X">540</integer> |
| 29 | <integer name="SWITCH_BUTTON_PLUS_Y">955</integer> | 29 | <integer name="SWITCH_BUTTON_PLUS_Y">950</integer> |
| 30 | <integer name="SWITCH_BUTTON_HOME_X">620</integer> | 30 | <integer name="SWITCH_BUTTON_HOME_X">600</integer> |
| 31 | <integer name="SWITCH_BUTTON_HOME_Y">960</integer> | 31 | <integer name="SWITCH_BUTTON_HOME_Y">950</integer> |
| 32 | <integer name="SWITCH_BUTTON_CAPTURE_X">380</integer> | 32 | <integer name="SWITCH_BUTTON_CAPTURE_X">400</integer> |
| 33 | <integer name="SWITCH_BUTTON_CAPTURE_Y">960</integer> | 33 | <integer name="SWITCH_BUTTON_CAPTURE_Y">950</integer> |
| 34 | <integer name="SWITCH_BUTTON_DPAD_X">260</integer> | 34 | <integer name="SWITCH_BUTTON_DPAD_X">260</integer> |
| 35 | <integer name="SWITCH_BUTTON_DPAD_Y">810</integer> | 35 | <integer name="SWITCH_BUTTON_DPAD_Y">790</integer> |
| 36 | 36 | ||
| 37 | </resources> | 37 | </resources> |