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

[안드로이드] 커스텀뷰: Paint 적용된 텍스트 너비, 높이(width, height) 확인 방법

by 카레유 2021. 8. 31.

안드로이드 커스텀뷰(CustomView)에서

Paint로 텍스트 사이즈를 설정하고, Canvas로 텍스트(drawText())를 그렸을 때,

 

Canvas를 통해 그려진 텍스트의 너비와 높이를 파악해야 할 경우가 있다.

텍스트의 너비(가로)/높이(세로)를 고려하여 다른 뷰를 그려야하는 경우 등등.

 

방법은 대략 2종류가 있는 것 같다.

 

1. 텍스트 width만 체크하는 방법

2. 텍스트 widht, height  모두 체크하는 방법


1. 텍스트 너비(Width)만 체크하는 방법

1) Paint.measureText(text: String) : text의 너비를 Float로 반환

2) Paint.measureText(text: String, start: Int, end: Int) : text의 start인덱스부터 end인덱스까지의 너비를 Float로 반환

* 두번째 함수를 사용하면 텍스트의 일부 너비만 체크할 수 있다.

 

< measureText() 예제 코드 >

class CustomViewSize: View {

    // 생성자
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        // String 문자열 생성
        val textString = "커스텀뷰에서 그린 텍스트"
        
        // Paint 객체 생성
        val paint = Paint()
        
        // Canvas로 텍스트 그리기
        canvas?.drawText(textString, 100f, 100f, paint)

        // measureText() 메서드로 텍스트의 너비 체크
        val textWidth = paint.measureText(textString)
        // val textWidth = paint.measureText(textString, 0, textString.length)
        
        // 로그에 찍어보기: 127.0
        Log.d("myLog", "$textWidth")

    }
}

 

measureText() 메서드에 대한 더 자세한 내용은 레퍼런스 참고

https://developer.android.com/reference/android/graphics/Paint#measureText(java.lang.String,%20int,%20int)

 

 

2. 텍스트 너비(Widht), 높이(Height) 모두 체크하는 방법

1) Rect 객체를 생성하고,

2) Paint.getTextBounds(text: String, start: Int, end: Int, bounds: Rect) 함수를 호출한 다음,

3) Rect객체.width(), Rect객체.height() 로 텍스트의 너비, 높이를 확인한다.

* getTextBounds()에 매개변수로 넣은 Rect객체에 텍스트의 너비, 높이가 할당된다.

* start, end 인덱스값을 통해 텍스트의 일부 너비, 높이만 체크할 수도 있다.

 

< getTextBounds() 예제 코드>

class CustomViewSize: View {

    // 생성자
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        val textString = "커스텀뷰에서 그린 텍스트"
        val paint = Paint()
        canvas?.drawText(textString, 100f, 100f, paint)

        // bounds객체(Rect) 생성
        val bounds = Rect()
        
        // getTextBounds()가 반환하는 값이 매개변수인 bounds에 할당된다.
        paint.getTextBounds(textString, 0, textString.length, bounds)

        // bounds에서 너비와 높이를 체크한다.
        val textWidth = bounds.width()
        val textHeight = bounds.height()

        // 로그에 찍어본다: 127, 12
        Log.d("myLog", "$textWidth, $textHeight")

    }
}

 

getTextBounds() 함수에 대한 자세한 내용은 레퍼런스 참고

https://developer.android.com/reference/android/graphics/Paint#getTextBounds(java.lang.String,%20int,%20int,%20android.graphics.Rect)

 

 

커스텀뷰 자체에 대한 기초는 아래 글 참고

[안드로이드 코틀린] View 출력 원리와 커스텀뷰 생성/사용 방법 기초

 

 

댓글