Я создал счетчик, в котором я хочу, чтобы приложение выводило значение, на котором останавливается счетчик, однако, если указатель счетчика остановился, скажем, в Италии, при выводе текста вы выбираете Индию, я перепробовал все, что знаю, но ничего по какой-то причине работает, не знаю, чего мне там не хватает!
Ниже приведен мой CustomWheelView, заранее благодарю за ваш любезный отзыв :)package com.tummyspinner.app
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Paint
import android.graphics.RectF
import android.graphics.Shader
import android.graphics.Typeface
import android.util.AttributeSet
import android.view.View
import kotlin.math.min
class CustomWheelView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.WHITE
textSize = 40f
textAlign = Paint.Align.CENTER
typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD)
}
private val gradientColors = listOf(
Color.parseColor("#F44336"), // Red
Color.parseColor("#FF9800"), // Orange
Color.parseColor("#FFEB3B"), // Yellow
Color.parseColor("#4CAF50"), // Green
Color.parseColor("#2196F3"), // Blue
Color.parseColor("#9C27B0"), // Purple
Color.parseColor("#E91E63") // Pink
)
private var rectF = RectF()
private var angle = 0f
private var isSpinning = false
private val segments = listOf("Italian", "Indian", "Chinese", "Mexican", "American", "Thai", "Japanese")
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val width = width.toFloat()
val height = height.toFloat()
val radius = min(width, height) / 2
rectF.set(width / 2 - radius, height / 2 - radius, width / 2 + radius, height / 2 + radius)
val sweepAngle = 360f / segments.size
for (i in segments.indices) {
paint.shader = LinearGradient(
rectF.centerX(), rectF.top,
rectF.centerX(), rectF.bottom,
gradientColors[i % gradientColors.size],
gradientColors[(i + 1) % gradientColors.size],
Shader.TileMode.CLAMP
)
canvas.drawArc(rectF, angle + i * sweepAngle, sweepAngle, true, paint)
val textAngle = Math.toRadians((angle + i * sweepAngle + sweepAngle / 2).toDouble())
val x = (width / 2 + radius * 0.65 * Math.cos(textAngle)).toFloat()
val y = (height / 2 + radius * 0.65 * Math.sin(textAngle)).toFloat()
canvas.drawText(segments, x, y, textPaint)
}
}
private var isListenerFired = false // Prevent multiple messages
fun spinWheel() {
if (!isSpinning) {
isSpinning = true
isListenerFired = false // Reset the flag at the start of the spin
val randomAngle = (360 * 5 + (0..360).random()).toFloat() // Random spin angle
animate()
.rotation(randomAngle)
.setDuration(3000)
.withEndAction {
// Bounce effect
animate().rotationBy(5f).setDuration(100).withEndAction {
animate().rotationBy(-5f).setDuration(100).withEndAction {
// Final calculations
angle = (angle + randomAngle) % 360 // Update current angle
isSpinning = false
invalidate()
val sweepAngle = 360f / segments.size
val correctedAngle = (360 - (angle % 360) + sweepAngle / 2) % 360
val selectedIndex = ((correctedAngle / sweepAngle).toInt() % segments.size)
// Ensure listener is invoked once
onWheelStoppedListener?.invoke(segments[selectedIndex])
}.start()
}.start()
}
.start()
}
}
private var onWheelStoppedListener: ((String) -> Unit)? = null
fun setOnWheelStoppedListener(listener: (String) -> Unit) {
onWheelStoppedListener = listener
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... nner-issue