Untitled
unknown
plain_text
3 years ago
5.3 kB
6
Indexable
package ru.spbstu.king_game
import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.util.Size
import android.view.MotionEvent
import android.view.View
import androidx.core.content.ContextCompat
class CardView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
defStyleRes: Int = 0
) : View(context, attrs, defStyleAttr, defStyleRes) {
val cardOffset = 40
// 280 320
val closedCardSize = Size(200, 240)
val openedCardSize = Size(200, 280)
val topBounds = Rect(300, 60, 300 + closedCardSize.width, 60 + closedCardSize.height)
val leftBounds = Rect(200, 1350, 200 + closedCardSize.width, 1350 + closedCardSize.height)
val rightBounds = Rect(200, 250, 200 + closedCardSize.width, 250 + closedCardSize.height)
val bottomBounds = Rect(60, 1500, 60 + openedCardSize.width, 1500 + openedCardSize.height)
val cardCount = 8
val closedCardDrawable = ContextCompat.getDrawable(context, R.drawable.closed_card_image)!!
val openedCardDrawable = ContextCompat.getDrawable(context, R.drawable.valet_card)!!
val textPaint = Paint().apply {
color = Color.WHITE
textSize = 40f
isAntiAlias = true
}
init {
setBackgroundResource(R.drawable.table_background)
}
override fun onDraw(canvas: Canvas) {
for (i in 0 until cardCount) {
val offset = cardOffset * i
closedCardDrawable.setBounds(
topBounds.left + offset,
topBounds.top,
topBounds.right + offset,
topBounds.bottom
)
closedCardDrawable.draw(canvas)
}
canvas.save()
canvas.rotate(90f, width / 2f, height / 2f)
for (i in 0 until cardCount) {
val offset = cardOffset * i
closedCardDrawable.setBounds(
leftBounds.left + offset,
leftBounds.top,
leftBounds.right + offset,
leftBounds.bottom
)
closedCardDrawable.draw(canvas)
}
for (i in 0 until cardCount) {
val offset = cardOffset * i
closedCardDrawable.setBounds(
rightBounds.left + offset,
rightBounds.top,
rightBounds.right + offset,
rightBounds.bottom
)
closedCardDrawable.draw(canvas)
}
canvas.restore()
val bottomOffset = (width - openedCardSize.width) / cardCount
for (i in 0 until cardCount) {
val offset = i * bottomOffset
openedCardDrawable.setBounds(
bottomBounds.left + offset,
bottomBounds.top,
bottomBounds.right + offset,
bottomBounds.bottom
)
openedCardDrawable.draw(canvas)
}
canvas.drawText("Ваш ход", 480f, 1430f, textPaint)
canvas.drawText("Player 1", 15f, 550f, textPaint)
canvas.drawText("Player 2", topBounds.left.toFloat() + 20f, topBounds.bottom + 70f, textPaint)
canvas.drawText("Player 3", width - 150f, 550f, textPaint)
openedCardDrawable.setBounds(450, 1000 - openedCardSize.height / 2, 450 + openedCardSize.width, 1000 + openedCardSize.height / 2)
openedCardDrawable.draw(canvas)
openedCardDrawable.setBounds(450 - openedCardSize.width, 1000 - openedCardSize.height, 450, 1000)
openedCardDrawable.draw(canvas)
openedCardDrawable.setBounds(450 + openedCardSize.width, 1000 - openedCardSize.height, 450 + openedCardSize.width * 2, 1000)
openedCardDrawable.draw(canvas)
openedCardDrawable.setBounds(450, 1000 - openedCardSize.height / 2 - openedCardSize.height, 450 + openedCardSize.width, 1000 - openedCardSize.height / 2)
openedCardDrawable.draw(canvas)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val evX = event.x
val evY = event.y
when (event.action) {
MotionEvent.ACTION_DOWN -> {
if (currentStatus === GameStatus.Playing) {
// If the touch is within the square
if (evX >= player.getX() && evX <= player.getX() + player.getBitmap()
.getWidth() && evY >= player.getY() && evY <= player.getY() + player.getBitmap()
.getHeight()
) {
// Activate the drag mode
isDragged = true
dragX = evX - player.getX()
dragY = evY - player.getY()
}
}
if (isDragged) {
// Defines new coordinates for drawing
player.setX(evX - dragX)
player.setY(evY - dragY)
invalidate()
}
}
MotionEvent.ACTION_MOVE -> if (isDragged) {
player.setX(evX - dragX)
player.setY(evY - dragY)
invalidate()
}
MotionEvent.ACTION_UP -> isDragged = false
}
return true
}
}Editor is loading...