Detect text overflow in Jetpack Compose
Text 컴포즈의 onTextLayout 에는 텍스트 컴포즈가 렌더링된 후의 렌더링 결과값을 받을 수 있다.
var badgeCount by remember { mutableStateOf(0) }
Text(
text = locations,
modifier = Modifier.fillMaxWidth(),
overflow = TextOverflow.Ellipsis,
maxLines = 1,
onTextLayout = { textLayoutResult ->
// 렌더링된 후의 렌더링 결과값인 textLayoutResult 를 받아올 수 있다.
if (**textLayoutResult.hasVisualOverflow**) {
val lineEndIndex = textLayoutResult.getLineEnd(
lineIndex = 0,
visibleEnd = true
)
badgeCount = locations
.substring(lineEndIndex)
.count { it == ',' }
}
},
)
if (badgeCount != 0) {
CounterBadge(badgeCount)
}
textLayoutResult 에는 다음과 같은 정보들이 포함된다.
TextLayoutResult | Android Developers
공개된 함수:
함수 | 반환 값 | 간단 설명 |
---|---|---|
copy(layoutInput: TextoutInput, size: IntSize) | TextLayoutResult | 복사 |
equls(other: Any?) | Boolean | 같은지 확인 |
getBidRunDirction(offset: Int) | ResolvedTextDirection | |
(지정된 문자 오프셋의 BiDi 실행 방향) | 지정된 오프셋의 문자와 확인된 BiDi 실행의 텍스트 Direction 을 가져온다. | |
getBoundingBox(offset: Int) | Rect | |
문자의 경계 상자(픽셀 단위) | 주어진 문자 오프셋에 대한 문자의 경계 상자를 반환한다. | |
getCursorRect | Rect | |
커서 영역의 직사각형 | 커서 영역의 직사각형을 반환한다. | |
getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean) | Float | |
텍스트 시작 가장자리로부터의 상대적인 거리 | 텍스트의 시작 오프셋으로부터의 상대적인 거리를 반환한다. |
예) 단락방향 왼 → 오 왼쪽 가장자리로부터의 거리로 양수값을 반환
※usePrimaryDirection : 주어진 오프셋이 BiDi 방향 전환 지점에 있는 경우 기본 실행 좌표를 사용하는 경우 true 설정 | | getLineBottom(lineIndex: Int) | Float 라인의 Index | 주어진 라인의 하단 y 좌표를 반환한다. | | getLineEnd(linIndex: Int, visibleEnd: Boolean = false) | Int 라인의 배타적인 끝 오프셋 | **주어진 문자 라인의 끝 오프셋을 반환한다.
예: abcd | efg |
일경우 getLineEnd(0) 은 위에 텍스트에 대해 0번째 줄의 end 인덱스인 4를 반환한다.
생략된 문자는 보이지 않는 문자로 처리된다.
※visibleEnd : true 인 경우, 렌더링되어 보이는 부분의 끝 인덱스를 반환한다.
false 인경우 렌더링이랑 관련없이 전달된 텍스트의 끝 인덱스를 그대로 전달한다.** | | getLineForOffset(offset: Int) | Int 원점 라인 번호 | 지정된 텍스트의 오프셋이 나타나는 텍스트 줄의 Index를 반환한다. | | getLineForVerticalPosition(vertical: Float) | Int 원점 라인 번호 | 주어진 그래픽 수직 위치에 가장 가까운 Line Index 를 반환한다. | | getLineLeft(lineIndex: Int) | Float 왼쪽 x 좌표 | 주어진 텍스트 줄 Index 의 왼쪽 x 좌표를 반환한다. | | | | | | | | | | | | |
textLayoutReulst 에는 렌더링된 텍스트의 끝 인덱스를 반환하는 다음 메소드가 있다.
textLayoutResult.getLineEnd(lineIndex = 0, visibleEnd = true)