Detect text overflow in Jetpack Compose

TextLayoutResult


Text 컴포즈의 onTextLayout 에는 텍스트 컴포즈가 렌더링된 후의 렌더링 결과값을 받을 수 있다.

Untitled

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)