diff --git a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/ButtonView.kt b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/ButtonView.kt index b2eba6b..e82ffac 100644 --- a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/ButtonView.kt +++ b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/ButtonView.kt @@ -8,6 +8,8 @@ import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.MotionEvent import android.view.View +import android.view.ViewGroup +import androidx.core.view.children import com.metallic.chiaki.R class ButtonView @JvmOverloads constructor( @@ -46,15 +48,36 @@ class ButtonView @JvmOverloads constructor( { super.onDraw(canvas) val drawable = if(buttonPressed) drawablePressed else drawableIdle - drawable?.setBounds(0, 0, width, height) + drawable?.setBounds(paddingLeft, paddingTop, width - paddingRight, height - paddingBottom) drawable?.draw(canvas) } + /** + * If this button overlaps with others in the same layout, + * let the one whose center is closest to the touch handle it. + */ + private fun bestFittingTouchView(x: Float, y: Float): View + { + val loc = locationOnScreen + Vector(x, y) + return (parent as? ViewGroup)?.children?.filter { + it is ButtonView + }?.filter { + val pos = it.locationOnScreen + loc.x >= pos.x && loc.x < pos.x + it.width && loc.y >= pos.y && loc.y < pos.y + it.height + }?.sortedBy { + (loc - (it.locationOnScreen + Vector(it.width.toFloat(), it.height.toFloat()) * 0.5f)).lengthSq + }?.firstOrNull() ?: this + } + override fun onTouchEvent(event: MotionEvent): Boolean { when(event.action) { - MotionEvent.ACTION_DOWN -> buttonPressed = true + MotionEvent.ACTION_DOWN -> { + if(bestFittingTouchView(event.x, event.y) != this) + return false + buttonPressed = true + } MotionEvent.ACTION_UP -> buttonPressed = false } return true diff --git a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/Vector.kt b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/Vector.kt index 36216e8..208c41a 100644 --- a/android/app/src/main/java/com/metallic/chiaki/touchcontrols/Vector.kt +++ b/android/app/src/main/java/com/metallic/chiaki/touchcontrols/Vector.kt @@ -2,6 +2,7 @@ package com.metallic.chiaki.touchcontrols +import android.view.View import kotlin.math.sqrt data class Vector(val x: Float, val y: Float) @@ -18,4 +19,10 @@ data class Vector(val x: Float, val y: Float) val lengthSq get() = x*x + y*y val length get() = sqrt(lengthSq) val normalized get() = this / length +} + +val View.locationOnScreen: Vector get() { + val v = intArrayOf(0, 0) + this.getLocationOnScreen(v) + return Vector(v[0].toFloat(), v[1].toFloat()) } \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_controls.xml b/android/app/src/main/res/layout/fragment_controls.xml index 0bf8011..3082f35 100644 --- a/android/app/src/main/res/layout/fragment_controls.xml +++ b/android/app/src/main/res/layout/fragment_controls.xml @@ -1,10 +1,12 @@ + android:clipChildren="false" + tools:ignore="RtlHardcoded,RtlSymmetry"> + app:layout_constraintBottom_toBottomOf="parent" /> @@ -116,7 +130,6 @@ android:id="@+id/l3ButtonView" android:layout_width="64dp" android:layout_height="64dp" - android:padding="8dp" app:drawableIdle="@drawable/control_button_l3" app:drawablePressed="@drawable/control_button_l3_pressed" app:layout_constraintLeft_toLeftOf="parent" @@ -126,7 +139,6 @@ android:id="@+id/r3ButtonView" android:layout_width="64dp" android:layout_height="64dp" - android:padding="8dp" app:drawableIdle="@drawable/control_button_r3" app:drawablePressed="@drawable/control_button_r3_pressed" app:layout_constraintRight_toRightOf="parent" @@ -137,7 +149,6 @@ android:id="@+id/psButtonView" android:layout_width="32dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginBottom="8dp" app:drawableIdle="@drawable/control_button_home" app:drawablePressed="@drawable/control_button_home_pressed" @@ -150,7 +161,6 @@ android:id="@+id/touchpadButtonView" android:layout_width="32dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" app:drawableIdle="@drawable/control_button_touchpad" app:drawablePressed="@drawable/control_button_touchpad_pressed" @@ -162,7 +172,6 @@ android:id="@+id/l2ButtonView" android:layout_width="64dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" app:drawableIdle="@drawable/control_button_l2" @@ -174,7 +183,6 @@ android:id="@+id/l1ButtonView" android:layout_width="64dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" app:drawableIdle="@drawable/control_button_l1" @@ -186,7 +194,6 @@ android:id="@+id/shareButtonView" android:layout_width="32dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" app:drawableIdle="@drawable/control_button_share" @@ -198,7 +205,6 @@ android:id="@+id/r2ButtonView" android:layout_width="64dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginRight="8dp" app:drawableIdle="@drawable/control_button_r2" @@ -210,7 +216,6 @@ android:id="@+id/r1ButtonView" android:layout_width="64dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginRight="8dp" app:drawableIdle="@drawable/control_button_r1" @@ -222,7 +227,6 @@ android:id="@+id/optionsButtonView" android:layout_width="32dp" android:layout_height="32dp" - android:padding="8dp" android:layout_marginTop="8dp" android:layout_marginRight="8dp" app:drawableIdle="@drawable/control_button_options" diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml index 543f0f4..9ee2e9b 100644 --- a/android/app/src/main/res/values/dimens.xml +++ b/android/app/src/main/res/values/dimens.xml @@ -1,6 +1,10 @@ - 48dp + 88dp + 176dp + 24dp + 16dp + 64dp 48dp 32dp 48dp