사용자가 클릭한 지점을 시작점으로 직선을 그리거나 원을 그리는 어플
-> menu 사용
MainActivity.kt
class MainActivity : AppCompatActivity() {
val setLine : Int = 1
val setCircle : Int = 2
var curShape : Int = setLine
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 화면에 결과 그리기
setContentView(MyGraphicView(this))
}
// actionBar에 메뉴 띄우기
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
super.onCreateOptionsMenu(menu)
val inflater : MenuInflater = menuInflater
// 직접 만든 custom menu 사용
inflater.inflate(R.menu.graph_menu, menu)
return true
}
// 메뉴에서 항목이 선택 되었을 때
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.addLine -> {
curShape = setLine
// Boolean type이라서 return true 사용
return true
}
R.id.addCircle -> {
curShape = setCircle
return true
}
else -> {
return super.onOptionsItemSelected(item)
}
}
}
// 실제로 그림을 그리는 class
inner class MyGraphicView(context: Context) : View(context) {
private var startX : Float = -1f
private var startY : Float = -1f
private var stopX : Float = -1f
private var stopY : Float = -1f
// 클릭 했을 때
override fun onTouchEvent(event: MotionEvent?): Boolean {
when(event?.action) {
// 클릭(화면을 터치)한 상태
MotionEvent.ACTION_DOWN -> {
startX = event.getX()
startY = event.getY()
}
// 클릭을 해제(화면에서 손을 뗀 상태)
MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> {
stopX = event.getX()
stopY = event.getY()
// 그림이 그려짐
this.invalidate()
}
}
return true
}
// inner class 안에 선언 -> canvas에 직접 그림을 그림
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
val paint = Paint()
// 확대시 안 깨지게 만들어주기
paint.isAntiAlias = true
paint.style = Paint.Style.STROKE
paint.strokeWidth = 5f
paint.color = Color.RED
// 선택된 항목이 선 or 원일 때
when(curShape) {
setLine -> canvas?.drawLine(startX, startY, stopX, stopY, paint) // 선 그리기
setCircle -> {
// 반지름을 구하기 위함
val a = (stopX - startX).pow(2)
val b = (stopY - startY).pow(2)
// 반지름 선언
val radius = sqrt(a + b)
// 원 그리기
canvas?.drawCircle(startX, startY, radius, paint)
}
}
}
}
}