본문 바로가기
개발(Development)/Android(안드로이드)

[안드로이드 코틀린] 커스텀 View 화면 갱신 방법(새로 그리기): invalidate()

by 카레유 2021. 8. 20.

안드로이드에서 커스텀 뷰를 만들 때,

특정 주기마다 View를 갱신하여 다시 그려야 할 때가 있다.

특히 이벤트 발생 시, 커스텀 뷰의 애니메이션 등을 구현할 때가 많다.

 

방법은 커스텀 뷰를 다시 그려야 할 때마다,

View 클래스에 정의된 invalidate() 메서드를 호출하는 것이다.


# View.invalidate() 메서드

View클래스에 정의된 Invalidate() 메서드를 호출하면,

해당 뷰 화면이 무효(invalid)임을 안드로이드에게 알리게 되고,

안드로이드는 현재의 뷰 상태를 반영하여 새로 화면을 그려준다.

 

View를 상속 받는 커스텀 뷰 클래스를 생성한 다음,

커스텀뷰를 다시 그려야 할 때마다 Invalidate() 메서드를 호출하도록 구현해주면 된다.

 

아래에 간단한 예제 코드를 작성해 봤다.


# 샘플 예제 코드

화면을 터치할 때마다, X좌표 값을 화면에 갱신하며 표시한다.

아래의 onTouchEvent() 메서드에서 invalidate()가 호출될 때마다 CustomView가 다시 그려진다.

class CustomView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {

    // 터치 X좌표값을 저장할 변수
    var coordsX: Float? = null

    // 화면 그리기
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        // 텍스트 사이즈 설정
        val paint = Paint()
        paint.textSize = 30f

        // coordX 변수에 저장된 값을 텍스트로 그린다.
        canvas?.drawText("$coordsX", 100f, 100f, paint)
    }


    // 터치 이벤트 처리
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        
        // 터치 X좌표 취득
        coordsX = event!!.x

        // ####### View 화면 다시 그리기
        invalidate()

        return true
    }
}

 

 

 

이런 원리를 활용하여 사용자의 이벤트나 입력값이 변경될 때마다

invalidate()를 호출하여 뷰를 다시 그리면 커스텀 뷰의 애니메이션 등도 구현이 가능하다.

 

 

댓글