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 не будет опубликован.