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