kotlin

canvas

beejaem 2022. 2. 24. 19:22

canvas와 Thread를 이용해서 움직임 만들기

 

 

실행화면

Ball.kt

class Ball {
    var posX = 0f
    var posY = 0f
    var speedX = 0
    var speedY = 0
    var bWidth = 0f
    constructor(posX: Float,posY:Float,speedX:Int,speedY:Int,bWidth:Float){
        this.posX = posX
        this.posY = posY
        this.speedX = speedX
        this.speedY = speedY
        this.bWidth = bWidth

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click"
        android:textSize="30sp" />

    <com.example.mycanvas.MyCanvas
        android:id="@+id/myCanvas"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/btn" />
</RelativeLayout>

MyCanvas.kt

package com.example.mycanvas

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 android.widget.Toast
import kotlin.random.Random

class MyCanvas : View {
    lateinit var p :Paint
    lateinit var ball : Ball
    var ballArr : ArrayList<Ball> = arrayListOf()

    constructor(context: Context?) : super(context){
        p = Paint()
        ballArr.add(Ball(100f,100f,5,5,50f))
    }

    constructor(context: Context?, attrs:  AttributeSet?) : super(context, attrs) {
        p = Paint()
        ball = Ball(100f,100f,5,5,50f)
        ballArr.add(Ball(100f,100f,5,5,50f))
        MyThread().start()
    }

    fun addBall(){
        var random = Random
        var bwidth = random.nextInt(50)
        ballArr.add(Ball(100f,100f,5,5,bwidth.toFloat()))
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        p.setColor(Color.RED)
        for(i in 0 until ballArr.size step 1){
            var ball = ballArr[i]
            canvas.drawCircle(ball.posX,ball.posY,ball.bWidth,p)
        }

        p.setColor(Color.BLUE)
        canvas.drawCircle(ball.posX,ball.posY,ball.bWidth,p)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        Toast.makeText(context, "터치 이벤트 발생", Toast.LENGTH_SHORT).show()
        return super.onTouchEvent(event)
    }

    inner class MyThread : Thread(){
        override fun run() {
            super.run()

            while (true){

                for(i in 0 until ballArr.size step 1){
                    var ball = ballArr[i]
                    ball.posX += ball.speedX
                    ball.posY += ball.speedY
                    if(ball.posX.toInt() >= width-ball.bWidth || ball.posX.toInt() <= 0+ball.bWidth){
                        ball.speedX *= -1
                    }
                    if(ball.posY.toInt() >= height-ball.bWidth || ball.posY.toInt() <= 0+ball.bWidth){
                        ball.speedY *= -1
                    }
                }

                invalidate()
                sleep(15)
            }
        }
    }


}

MainActivity.kt

package com.example.mycanvas

import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {

    lateinit var btn: Button
    lateinit var myCanvas: MyCanvas
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn = findViewById(R.id.btn)
        myCanvas = findViewById(R.id.myCanvas)

        btn.setOnClickListener {
            myCanvas.addBall()
            myCanvas.invalidate()
        }
    }
}

 

'kotlin' 카테고리의 다른 글

image파일 저장하기  (0) 2022.08.26
qr코드 생성하기  (0) 2022.08.22
앱 만들어보기 - 1  (0) 2022.02.19
SharedPreferences  (0) 2022.02.16
handler  (0) 2022.02.10