[Jetpack Compose] Text Width(텍스트 너비) 측정하기

2024. 5. 6. 20:02·Jetpack Compose
목차
  1. rememberTextMeasurer()
  2. 측정 방법
  3. Reference

Compose의 TextField(BasicTextField)에는 기본 너비가 설정되어있다. 따라서 너비 설정 없이 사용할 때는 어느 정도 알아서 공간을 차지하지만 원하는 너비로 조절하기 위해서는 Modifier.width 속성을 사용해 너비를 직접 설정해 주어야 한다. 이 때 Text의 너비에 맞게 자동으로 너비를 조절되도록 설정하는 방법을 설명한다.

 

rememberTextMeasurer()

@Composable
fun rememberTextMeasurer(
cacheSize: Int = DefaultCacheSize
): TextMeasurer {
val fontFamilyResolver = LocalFontFamilyResolver.current
val density = LocalDensity.current
val layoutDirection = LocalLayoutDirection.current
return remember(fontFamilyResolver, density, layoutDirection, cacheSize) {
TextMeasurer(fontFamilyResolver, density, layoutDirection, cacheSize)
}
}

해당 내장 함수를 분석해보면 cacheSize라는 매개 변수가 있지만 기본값을 사용하므로 별도로 입력해줄 필요는 없으며 원한다면 측정 결과를 저장할 캐시 크기를 설정할 수 있다. 그 아래 코드를 보면 여러 Local 정보를 토대로 Text를 측정하게 된다. 이 때 fontFamily로 기본 설정되어 있는 fontFamily를 사용하기 때문에 아래에서 설명할 내용처럼 fontFamily 관련 처리를 해주어야 한다. 

 

측정 방법

// rememberTextMeasurer를 사용하여 TextMeasurer 생성
val measurer = rememberTextMeasurer()
// 텍스트 스타일 설정
val textStyle = TextStyle(
fontFamily = pretendard,
fontSize = 18.sp,
fontWeight = FontWeight.Normal,
color = Color.DarkGray
)
// 텍스트 생성(여기서는 TextFieldValue 사용)
var example by remember { mutableStateOf(TextFieldValue("예시")) }
// 텍스트 너비 측정 및 dp 단위 변환
val textWidth = density.run { measurer.measure(example.text, textStyle).size.width.toDp() + 2.dp }
BasicTextField(
value = example,
onValueChange = { example = it },
textStyle = textStyle,
modifier = Modifier
.width(textWidth)
)

1. textMeasurer과 textStyle을 설정한다. 

 

- 기본 폰트가 아닌 커스텀 폰트를 사용한다면 반드시 폰트 스타일을 생성해 measurer를 사용할 때 입력해 주어야 한다. textStyle을 설정하지 않는다면 font의 자간 간격이나 높이 차이로 인해 측정 차이가 생기기 때문이다. 

 

 

2. measurer을 사용해 얻은 값은 Int 형식이기 때문에 width 속성에 맞게 dp로 변환해준다.

 

- LocalDensity.current로 density를 만들어준 후 density.run 또는 with(density)로 toDp()를 사용해준다. 

 

- 2.dp는 TextField에 기본값이 존재할 경우 클릭 시 커서가 생성되며 기본 텍스트를 왼쪽으로 밀어내기 때문에 왼쪽이 약간 잘리게 된다. 이를 해결하기 위해 커서 크기 정도의 약간의 공간을 주었고 기본값을 사용하지 않거나 좀 더 넓은 여백을 원한다면 알아서 조절하면 된다. 

 

 

3. 별도의 decoration 없이 글자만 보여주기 위해 BasicTextField를 사용하였으며 다른 TextField에서도 동일한 방법으로 사용할 수 있다. TextField의 Modifier 설정에서 측정한 textWidth 값을 width의 값으로 설정해주면 된다. 

 

Reference

https://developer.android.com/develop/ui/compose/graphics/draw/overview?hl=ko#measure-text

 

Compose의 그래픽  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 그래픽 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 많은 앱에서 화면에 표시되는 내용을

developer.android.com

 

  1. rememberTextMeasurer()
  2. 측정 방법
  3. Reference
'Jetpack Compose' 카테고리의 다른 글
  • [Jetpack Compose] Ripple(물결) 효과 제거하기
  • [Jetpack Compose] Calendar 만들기
  • [Jetpack Compose] Drag and Drop(드래그해서 재정렬) 기능 만들기
  • [Jetpack Compose] Text Default FontFamily(기본 폰트) 설정하기
브애애앳
브애애앳
  • 브애애앳
    디벨로퍼즐
    브애애앳
  • 전체
    오늘
    어제
    • 분류 전체보기 (21)
      • Jetpack Compose (15)
      • Kotlin (3)
      • Android Studio (2)
      • Tistory (1)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
브애애앳
[Jetpack Compose] Text Width(텍스트 너비) 측정하기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.