mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 21:13:12 -07:00
Extend Face Button Touch Areas on Android
This commit is contained in:
parent
c1a4504470
commit
b69bf280f8
4 changed files with 67 additions and 29 deletions
|
@ -8,6 +8,8 @@ import android.graphics.drawable.Drawable
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.view.children
|
||||||
import com.metallic.chiaki.R
|
import com.metallic.chiaki.R
|
||||||
|
|
||||||
class ButtonView @JvmOverloads constructor(
|
class ButtonView @JvmOverloads constructor(
|
||||||
|
@ -46,15 +48,36 @@ class ButtonView @JvmOverloads constructor(
|
||||||
{
|
{
|
||||||
super.onDraw(canvas)
|
super.onDraw(canvas)
|
||||||
val drawable = if(buttonPressed) drawablePressed else drawableIdle
|
val drawable = if(buttonPressed) drawablePressed else drawableIdle
|
||||||
drawable?.setBounds(0, 0, width, height)
|
drawable?.setBounds(paddingLeft, paddingTop, width - paddingRight, height - paddingBottom)
|
||||||
drawable?.draw(canvas)
|
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
|
override fun onTouchEvent(event: MotionEvent): Boolean
|
||||||
{
|
{
|
||||||
when(event.action)
|
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
|
MotionEvent.ACTION_UP -> buttonPressed = false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
package com.metallic.chiaki.touchcontrols
|
package com.metallic.chiaki.touchcontrols
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
|
|
||||||
data class Vector(val x: Float, val y: Float)
|
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 lengthSq get() = x*x + y*y
|
||||||
val length get() = sqrt(lengthSq)
|
val length get() = sqrt(lengthSq)
|
||||||
val normalized get() = this / length
|
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())
|
||||||
}
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:clipChildren="false">
|
android:clipChildren="false"
|
||||||
|
tools:ignore="RtlHardcoded,RtlSymmetry">
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ControlsBackgroundView
|
<com.metallic.chiaki.touchcontrols.ControlsBackgroundView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -57,8 +59,8 @@
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/faceButtonsLayout"
|
android:id="@+id/faceButtonsLayout"
|
||||||
android:layout_width="144dp"
|
android:layout_width="@dimen/control_face_button_size_full"
|
||||||
android:layout_height="144dp"
|
android:layout_height="@dimen/control_face_button_size_full"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
@ -67,9 +69,12 @@
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ButtonView
|
<com.metallic.chiaki.touchcontrols.ButtonView
|
||||||
android:id="@+id/crossButtonView"
|
android:id="@+id/crossButtonView"
|
||||||
android:layout_width="@dimen/control_face_button_size"
|
android:layout_width="@dimen/control_face_button_size_full"
|
||||||
android:layout_height="@dimen/control_face_button_size"
|
android:layout_height="@dimen/control_face_button_size_half"
|
||||||
android:padding="8dp"
|
android:paddingLeft="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingRight="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingTop="@dimen/control_face_button_padding_to_center"
|
||||||
|
android:paddingBottom="@dimen/control_face_button_padding_to_outside"
|
||||||
app:drawableIdle="@drawable/control_button_cross"
|
app:drawableIdle="@drawable/control_button_cross"
|
||||||
app:drawablePressed="@drawable/control_button_cross_pressed"
|
app:drawablePressed="@drawable/control_button_cross_pressed"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
@ -78,9 +83,12 @@
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ButtonView
|
<com.metallic.chiaki.touchcontrols.ButtonView
|
||||||
android:id="@+id/moonButtonView"
|
android:id="@+id/moonButtonView"
|
||||||
android:layout_width="@dimen/control_face_button_size"
|
android:layout_width="@dimen/control_face_button_size_half"
|
||||||
android:layout_height="@dimen/control_face_button_size"
|
android:layout_height="@dimen/control_face_button_size_full"
|
||||||
android:padding="8dp"
|
android:paddingTop="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingBottom="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingLeft="@dimen/control_face_button_padding_to_center"
|
||||||
|
android:paddingRight="@dimen/control_face_button_padding_to_outside"
|
||||||
app:drawableIdle="@drawable/control_button_moon"
|
app:drawableIdle="@drawable/control_button_moon"
|
||||||
app:drawablePressed="@drawable/control_button_moon_pressed"
|
app:drawablePressed="@drawable/control_button_moon_pressed"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
@ -89,9 +97,12 @@
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ButtonView
|
<com.metallic.chiaki.touchcontrols.ButtonView
|
||||||
android:id="@+id/pyramidButtonView"
|
android:id="@+id/pyramidButtonView"
|
||||||
android:layout_width="@dimen/control_face_button_size"
|
android:layout_width="@dimen/control_face_button_size_full"
|
||||||
android:layout_height="@dimen/control_face_button_size"
|
android:layout_height="@dimen/control_face_button_size_half"
|
||||||
android:padding="8dp"
|
android:paddingLeft="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingRight="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingBottom="@dimen/control_face_button_padding_to_center"
|
||||||
|
android:paddingTop="@dimen/control_face_button_padding_to_outside"
|
||||||
app:drawableIdle="@drawable/control_button_pyramid"
|
app:drawableIdle="@drawable/control_button_pyramid"
|
||||||
app:drawablePressed="@drawable/control_button_pyramid_pressed"
|
app:drawablePressed="@drawable/control_button_pyramid_pressed"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
@ -100,14 +111,17 @@
|
||||||
|
|
||||||
<com.metallic.chiaki.touchcontrols.ButtonView
|
<com.metallic.chiaki.touchcontrols.ButtonView
|
||||||
android:id="@+id/boxButtonView"
|
android:id="@+id/boxButtonView"
|
||||||
android:layout_width="@dimen/control_face_button_size"
|
android:layout_width="@dimen/control_face_button_size_half"
|
||||||
android:layout_height="@dimen/control_face_button_size"
|
android:layout_height="@dimen/control_face_button_size_full"
|
||||||
android:padding="8dp"
|
android:paddingTop="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingBottom="@dimen/control_face_button_padding_to_full"
|
||||||
|
android:paddingRight="@dimen/control_face_button_padding_to_center"
|
||||||
|
android:paddingLeft="@dimen/control_face_button_padding_to_outside"
|
||||||
app:drawableIdle="@drawable/control_button_box"
|
app:drawableIdle="@drawable/control_button_box"
|
||||||
app:drawablePressed="@drawable/control_button_box_pressed"
|
app:drawablePressed="@drawable/control_button_box_pressed"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
@ -116,7 +130,6 @@
|
||||||
android:id="@+id/l3ButtonView"
|
android:id="@+id/l3ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="64dp"
|
android:layout_height="64dp"
|
||||||
android:padding="8dp"
|
|
||||||
app:drawableIdle="@drawable/control_button_l3"
|
app:drawableIdle="@drawable/control_button_l3"
|
||||||
app:drawablePressed="@drawable/control_button_l3_pressed"
|
app:drawablePressed="@drawable/control_button_l3_pressed"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
@ -126,7 +139,6 @@
|
||||||
android:id="@+id/r3ButtonView"
|
android:id="@+id/r3ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="64dp"
|
android:layout_height="64dp"
|
||||||
android:padding="8dp"
|
|
||||||
app:drawableIdle="@drawable/control_button_r3"
|
app:drawableIdle="@drawable/control_button_r3"
|
||||||
app:drawablePressed="@drawable/control_button_r3_pressed"
|
app:drawablePressed="@drawable/control_button_r3_pressed"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
@ -137,7 +149,6 @@
|
||||||
android:id="@+id/psButtonView"
|
android:id="@+id/psButtonView"
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_home"
|
app:drawableIdle="@drawable/control_button_home"
|
||||||
app:drawablePressed="@drawable/control_button_home_pressed"
|
app:drawablePressed="@drawable/control_button_home_pressed"
|
||||||
|
@ -150,7 +161,6 @@
|
||||||
android:id="@+id/touchpadButtonView"
|
android:id="@+id/touchpadButtonView"
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_touchpad"
|
app:drawableIdle="@drawable/control_button_touchpad"
|
||||||
app:drawablePressed="@drawable/control_button_touchpad_pressed"
|
app:drawablePressed="@drawable/control_button_touchpad_pressed"
|
||||||
|
@ -162,7 +172,6 @@
|
||||||
android:id="@+id/l2ButtonView"
|
android:id="@+id/l2ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_l2"
|
app:drawableIdle="@drawable/control_button_l2"
|
||||||
|
@ -174,7 +183,6 @@
|
||||||
android:id="@+id/l1ButtonView"
|
android:id="@+id/l1ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_l1"
|
app:drawableIdle="@drawable/control_button_l1"
|
||||||
|
@ -186,7 +194,6 @@
|
||||||
android:id="@+id/shareButtonView"
|
android:id="@+id/shareButtonView"
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_share"
|
app:drawableIdle="@drawable/control_button_share"
|
||||||
|
@ -198,7 +205,6 @@
|
||||||
android:id="@+id/r2ButtonView"
|
android:id="@+id/r2ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_r2"
|
app:drawableIdle="@drawable/control_button_r2"
|
||||||
|
@ -210,7 +216,6 @@
|
||||||
android:id="@+id/r1ButtonView"
|
android:id="@+id/r1ButtonView"
|
||||||
android:layout_width="64dp"
|
android:layout_width="64dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_r1"
|
app:drawableIdle="@drawable/control_button_r1"
|
||||||
|
@ -222,7 +227,6 @@
|
||||||
android:id="@+id/optionsButtonView"
|
android:id="@+id/optionsButtonView"
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:padding="8dp"
|
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
app:drawableIdle="@drawable/control_button_options"
|
app:drawableIdle="@drawable/control_button_options"
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<dimen name="control_face_button_size">48dp</dimen>
|
<dimen name="control_face_button_size_half">88dp</dimen>
|
||||||
|
<dimen name="control_face_button_size_full">176dp</dimen>
|
||||||
|
<dimen name="control_face_button_padding_to_center">24dp</dimen>
|
||||||
|
<dimen name="control_face_button_padding_to_outside">16dp</dimen>
|
||||||
|
<dimen name="control_face_button_padding_to_full">64dp</dimen>
|
||||||
<dimen name="control_analog_stick_radius">48dp</dimen>
|
<dimen name="control_analog_stick_radius">48dp</dimen>
|
||||||
<dimen name="control_analog_stick_handle_radius">32dp</dimen>
|
<dimen name="control_analog_stick_handle_radius">32dp</dimen>
|
||||||
<dimen name="floating_action_button_speed_dial_anim_offset">48dp</dimen>
|
<dimen name="floating_action_button_speed_dial_anim_offset">48dp</dimen>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue