Skip to content

Commit

Permalink
Add labels to virtual buttons.
Browse files Browse the repository at this point in the history
  • Loading branch information
Swordfish90 committed Feb 16, 2020
1 parent 49c2baf commit c5b8bf1
Show file tree
Hide file tree
Showing 20 changed files with 193 additions and 26 deletions.
@@ -1,21 +1,21 @@
package com.swordfish.touchinput.utils

import android.content.res.Resources
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Typeface
import com.swordfish.touchinput.controller.R

object TextPainter {
private val textPaint = Paint()

init {
textPaint.color = Color.argb(40, 255, 255, 255)
textPaint.typeface = Typeface.DEFAULT_BOLD
textPaint.style = Paint.Style.FILL
class TextPainter(resources: Resources) {
private val textPaint = Paint().apply {
this.color = resources.getColor(R.color.touch_control_text_color)
this.typeface = Typeface.DEFAULT_BOLD
this.style = Paint.Style.FILL
}

fun paintText(left: Float, top: Float, width: Float, height: Float, text: String, canvas: Canvas) {
textPaint.textSize = height / 3f
textPaint.textSize = minOf(height, width) / 3f
val textWidth = textPaint.measureText(text)

val xPos = left - textWidth / 2f + width / 2f
Expand Down
Expand Up @@ -16,7 +16,6 @@ import com.swordfish.touchinput.events.ViewEvent
import com.swordfish.touchinput.interfaces.ButtonEventsSource
import com.swordfish.touchinput.utils.TextPainter
import io.reactivex.Observable
import timber.log.Timber
import kotlin.math.abs
import kotlin.math.cos
import kotlin.math.floor
Expand All @@ -36,6 +35,8 @@ class ActionButtons @JvmOverloads constructor(
private var cols: Int = 2
private var rotateButtons: Float = 0.0f
private var supportsMultipleInputs: Boolean = false
private var labels: List<String> = listOf()
private var labelDrawables: List<Drawable> = listOf()

private var rotatedSize: Float = 0f
private var notRotatedSize: Float = 0f
Expand All @@ -52,11 +53,13 @@ class ActionButtons @JvmOverloads constructor(

private val touchRotationMatrix = Matrix()

private val textPainter = TextPainter(resources)

init {
pressedDrawable = retrieveDrawable(R.drawable.action_pressed)
normalDrawable = retrieveDrawable(R.drawable.action_normal)

context.theme.obtainStyledAttributes(attrs, R.styleable.ActionButtons, defStyleAttr, 0)?.let {
context.theme.obtainStyledAttributes(attrs, R.styleable.ActionButtons, defStyleAttr, 0).let {
initializeFromAttributes(it)
}
}
Expand All @@ -69,6 +72,19 @@ class ActionButtons @JvmOverloads constructor(
cols = a.getInt(R.styleable.ActionButtons_cols, 2)
spacing = a.getFloat(R.styleable.ActionButtons_spacing, 0.1f)
rotateButtons = a.getFloat(R.styleable.ActionButtons_rotateButtons, 0.0f)

val labelsId = a.getResourceId(R.styleable.ActionButtons_labels, 0)
if (labelsId != 0) {
labels = resources.getStringArray(labelsId).toList()
}

val labelDrawablesId = a.getResourceId(R.styleable.ActionButtons_labelDrawables, 0)
if (labelDrawablesId != 0) {
val tmp = resources.obtainTypedArray(labelDrawablesId)
labelDrawables = (0 until tmp.length()).map { tmp.getResourceId(it, 0) }.map { retrieveDrawable(it)!! }
tmp.recycle()
}
a.recycle()
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
Expand Down Expand Up @@ -130,24 +146,46 @@ class ActionButtons @JvmOverloads constructor(
val left = (xPadding + col * buttonSize)
val top = (yPadding + row * buttonSize)

val xPivot = left + width / 2f
val yPivot = top + height / 2f

canvas.rotate(rotateButtons, xPivot, yPivot)

TextPainter.paintText(left, top, width.toFloat(), height.toFloat(), "X", canvas)

canvas.rotate(-rotateButtons, xPivot, yPivot)

drawable.setBounds(left.toInt(), top.toInt(), (left + width).toInt(), (top + height).toInt())
drawable.draw(canvas)

labels.getOrNull(index)?.let {
drawLabel(canvas, left, top, width, height, it)
}

labelDrawables.getOrNull(index)?.let {
drawDrawableLabel(canvas, left, top, width, height, it)
}
}
}
}

canvas.restore()
}

private fun drawLabel(canvas: Canvas, left: Float, top: Float, width: Int, height: Int, label: String) {
val xPivot = left + width / 2f
val yPivot = top + height / 2f

canvas.rotate(rotateButtons, xPivot, yPivot)

textPainter.paintText(left, top, width.toFloat(), height.toFloat(), label, canvas)

canvas.rotate(-rotateButtons, xPivot, yPivot)
}

private fun drawDrawableLabel(canvas: Canvas, left: Float, top: Float, width: Int, height: Int, drawable: Drawable) {
val xPivot = left + width / 2f
val yPivot = top + height / 2f

canvas.rotate(rotateButtons, xPivot, yPivot)

drawable.setBounds((left + 0.25 * width).toInt(), (top + 0.25 * height).toInt(), (left + width -0.25 * width).toInt(), (top + height - 0.25 * height).toInt())
drawable.draw(canvas)

canvas.rotate(-rotateButtons, xPivot, yPivot)
}

@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
Expand Down
Expand Up @@ -112,7 +112,7 @@ class DirectionPad @JvmOverloads constructor(
getStateDrawable(i, isPressed)?.let {
val height = drawableSize
val width = drawableSize
val angle = Math.toRadians((cAngle - ROTATE_BUTTONS + SINGLE_BUTTON_ANGLE / 2f).toDouble())
val angle = toRadians((cAngle - ROTATE_BUTTONS + SINGLE_BUTTON_ANGLE / 2f).toDouble())
val left = (radius * buttonCenterDistance * cos(angle) + radius).toInt() - width / 2
val top = (radius * buttonCenterDistance * sin(angle) + radius).toInt() - height / 2

Expand Down
@@ -1,6 +1,7 @@
package com.swordfish.touchinput.views.base

import android.content.Context
import android.content.res.TypedArray
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.KeyEvent
Expand All @@ -22,11 +23,22 @@ abstract class BaseSingleButton @JvmOverloads constructor(
) : AppCompatButton(context, attrs, defStyleAttr), ButtonEventsSource {

private val events: PublishRelay<ViewEvent.Button> = PublishRelay.create()
private val textPainter = TextPainter(context.resources)

private var label: String = ""

init {
context.theme.obtainStyledAttributes(attrs, R.styleable.BaseSingleButton, defStyleAttr, 0).let {
initializeFromAttributes(it)
}
setOnTouchListener { _, event -> handleTouchEvent(event); true }
}

private fun initializeFromAttributes(a: TypedArray) {
label = a.getString(R.styleable.BaseSingleButton_label) ?: ""
a.recycle()
}

private fun handleTouchEvent(event: MotionEvent) {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
Expand All @@ -44,7 +56,9 @@ abstract class BaseSingleButton @JvmOverloads constructor(

override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
TextPainter.paintText(0f, 0f, width.toFloat(), height.toFloat(), "A", canvas)
if (label.isNotBlank()) {
textPainter.paintText(0f, 0f, width.toFloat(), height.toFloat(), label, canvas)
}
}

open fun getSuggestedButtonWidth(): Int {
Expand Down
10 changes: 10 additions & 0 deletions lemuroid-touchinput/src/main/res/drawable/psx_circle.xml
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100dp"
android:height="100dp"
android:viewportWidth="100"
android:viewportHeight="100">
<path
android:fillColor="@color/touch_control_text_color"
android:pathData="m50,90.662c-22.425,0 -40.662,-18.237 -40.662,-40.662 0,-22.425 18.237,-40.662 40.662,-40.662 22.425,0 40.662,18.237 40.662,40.662 0,22.425 -18.237,40.662 -40.662,40.662zM50,22.892c-14.95,0 -27.108,12.158 -27.108,27.108 0,14.95 12.158,27.108 27.108,27.108 14.95,0 27.108,-12.158 27.108,-27.108 0,-14.95 -12.158,-27.108 -27.108,-27.108z"
android:strokeWidth="6.77697039"/>
</vector>
12 changes: 12 additions & 0 deletions lemuroid-touchinput/src/main/res/drawable/psx_cross.xml
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100dp"
android:height="100dp"
android:viewportWidth="100"
android:viewportHeight="100">
<path
android:pathData="m77.108,83.885c-3.944,0.06 -6.096,-3.581 -8.722,-5.916 -16.909,-16.941 -33.884,-33.819 -50.751,-50.8 -3.281,-3.675 -0.906,-10.207 3.964,-10.931 3.294,-0.818 5.947,1.509 7.982,3.761 17.586,17.619 35.24,35.174 52.784,52.833 3.281,3.674 0.907,10.206 -3.962,10.928l-0.645,0.093zM22.892,83.885c-4.896,0.219 -8.473,-5.692 -6.002,-9.927 2.097,-2.941 4.982,-5.237 7.446,-7.876 16.173,-16.14 32.283,-32.348 48.496,-48.447 3.675,-3.281 10.207,-0.906 10.931,3.964 0.818,3.294 -1.51,5.947 -3.761,7.982 -17.619,17.586 -35.173,35.239 -52.832,52.783 -1.194,0.981 -2.733,1.525 -4.277,1.52z"
android:strokeWidth="6.77697039"
android:fillColor="@color/touch_control_text_color"
android:fillAlpha="1"/>

</vector>
10 changes: 10 additions & 0 deletions lemuroid-touchinput/src/main/res/drawable/psx_square.xml
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100dp"
android:height="100dp"
android:viewportWidth="100"
android:viewportHeight="100">
<path
android:fillColor="@color/touch_control_text_color"
android:pathData="M77.108,83.885L22.892,83.885c-3.748,0 -6.777,-3.036 -6.777,-6.777v-54.216c0,-3.741 3.029,-6.777 6.777,-6.777h54.216c3.748,0 6.777,3.036 6.777,6.777v54.216c0,3.741 -3.029,6.777 -6.777,6.777zM29.669,70.331L70.331,70.331L70.331,29.669L29.669,29.669Z"
android:strokeWidth="6.77697039"/>
</vector>
10 changes: 10 additions & 0 deletions lemuroid-touchinput/src/main/res/drawable/psx_triangle.xml
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100dp"
android:height="100dp"
android:viewportWidth="100"
android:viewportHeight="100">
<path
android:fillColor="@color/touch_control_text_color"
android:pathData="m83.889,83.779h-67.77c-2.46,0 -4.73,-1.334 -5.93,-3.49 -1.193,-2.154 -1.125,-4.791 0.182,-6.879l33.885,-54.216c2.474,-3.965 9.013,-3.965 11.487,0l33.885,54.216c1.308,2.088 1.376,4.724 0.182,6.879 -1.193,2.154 -3.463,3.49 -5.923,3.49zM28.352,70.225h43.312l-21.659,-34.651z"
android:strokeWidth="6.77697039"/>
</vector>
2 changes: 2 additions & 0 deletions lemuroid-touchinput/src/main/res/layout/layout_arcade.xml
Expand Up @@ -7,6 +7,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/select"
app:label="@string/coin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
Expand All @@ -17,6 +18,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
Expand Down
2 changes: 2 additions & 0 deletions lemuroid-touchinput/src/main/res/layout/layout_gb.xml
Expand Up @@ -6,6 +6,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/select"
app:label="@string/select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
Expand All @@ -17,6 +18,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
Expand Down
4 changes: 4 additions & 0 deletions lemuroid-touchinput/src/main/res/layout/layout_gba.xml
Expand Up @@ -7,6 +7,7 @@

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/r1"
app:label="R"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
Expand All @@ -16,6 +17,7 @@

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/l1"
app:label="L"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
Expand All @@ -25,6 +27,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/select"
app:label="@string/select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
Expand All @@ -36,6 +39,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand Down
1 change: 1 addition & 0 deletions lemuroid-touchinput/src/main/res/layout/layout_genesis.xml
Expand Up @@ -7,6 +7,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand Down
10 changes: 7 additions & 3 deletions lemuroid-touchinput/src/main/res/layout/layout_n64.xml
Expand Up @@ -7,6 +7,7 @@

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/r1"
app:label="R"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand All @@ -15,7 +16,8 @@
app:layout_constraintEnd_toEndOf="parent" />

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/l2"
android:id="@+id/l1"
app:label="L"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
Expand All @@ -25,7 +27,8 @@
app:layout_constraintVertical_bias="1.0" />

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/l1"
android:id="@+id/l2"
app:label="Z"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
Expand All @@ -34,12 +37,13 @@
app:layout_constraintBottom_toTopOf="@+id/direction"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@id/l2"
app:layout_constraintStart_toEndOf="@id/l1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0" />

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand Down
4 changes: 4 additions & 0 deletions lemuroid-touchinput/src/main/res/layout/layout_nds.xml
Expand Up @@ -7,6 +7,7 @@

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/r1"
app:label="R"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand All @@ -16,6 +17,7 @@

<com.swordfish.touchinput.views.LargeSingleButton
android:id="@+id/l1"
app:label="L"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
Expand All @@ -25,6 +27,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/select"
app:label="@string/select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
Expand All @@ -35,6 +38,7 @@

<com.swordfish.touchinput.views.SmallSingleButton
android:id="@+id/start"
app:label="@string/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
Expand Down

0 comments on commit c5b8bf1

Please sign in to comment.