CustomView #4

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import com.neco_desarrollo.customviewlesson.databinding.ActivityMainBinding
import com.squareup.picasso.Picasso

class MainActivity : AppCompatActivity(), TestView.Listener {
private lateinit var binding: ActivityMainBinding
private val menuList = listOf(
"Add", "Edit", "Paint", "Clear", "Delete", "Exit", "Hello", "Draw"
)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.testView.listener = this
}

override fun onClick(index: Int) {
binding.tvSelection.text = menuList[index]
}
}

TestView.kt

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import android.view.View
import java.lang.Math.atan2
import kotlin.math.atan2

class TestView(
context: Context,
attributeSet: AttributeSet
) : View(context, attributeSet) {
var listener: Listener? = null
private val paint = Paint()
private val paintC = Paint()
private val startAngle = 0f
private val colors = listOf(
Color.RED,
Color.BLUE,
Color.GREEN,
Color.CYAN,
Color.BLACK,
Color.GREEN,
Color.DKGRAY,
Color.YELLOW
)
private val sweepAngle = 360f / colors.size
private var buttonClicked = 0

init {
paint.style = Paint.Style.STROKE
paint.color = Color.GRAY
paint.strokeWidth = 5f
paintC.style = Paint.Style.FILL
paintC.color = Color.RED
}

override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
drawCircleButton(canvas)
}

private fun drawCircleButton(canvas: Canvas) {
val centerX = width / 2f
val centerY = width / 2f
val radius = width.coerceAtMost(height) / 2f

for (i in colors.indices) {
paintC.color = if (i == buttonClicked)
Color.GRAY
else colors[i]
canvas.drawArc(
centerX - radius,
centerY - radius,
centerX + radius,
centerY + radius,
startAngle + i * sweepAngle,
sweepAngle,
true,
paintC
)
}
paintC.color = Color.GRAY
canvas.drawCircle(
centerX ,
centerY ,
radius / 1.7f,
paintC
)
}

override fun onTouchEvent(event: MotionEvent): Boolean {
val centerX = width / 2f
val centerY = width / 2f
val x = event.x
val y = event.y

when (event.action) {
MotionEvent.ACTION_DOWN -> {
val angle = (Math.toDegrees(
atan2(
y - centerY,
x - centerX
).toDouble()
) + 360) % 360
buttonClicked = (angle / ( 360 / colors.size)).toInt()
listener?.onClick(buttonClicked)
Log.d("MyLog", "Angle: $angle")
invalidate()
}
}
return true
}

interface Listener{
fun onClick(index: Int)
}
}

1 комментарий для “CustomView #4”

  1. Добрый день, вы тут случайно оставили ссылку не на то видео и, пользуясь случаем, спасибо вам за то, что вы делаете!

Добавить комментарий

Ваш адрес email не будет опубликован.