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 |