Не допускайте увеличения текста в Jetpack Compose при увеличении размера шрифта устройства

#android #kotlin #android-jetpack-compose

Вопрос:

У меня в приложении есть экран, на котором отображается таймер. Если пользователь решит увеличить размер шрифта в меню настроек устройства, то текст станет слишком большим для макета, и он начнет сворачиваться. Это не проблема для других моих экранов, на которых больше текста. Для этого экрана — и только для этого экрана — я бы предпочел, чтобы текст таймера не увеличивался в размере, если используются специальные возможности.

Хорошо отформатированная страница создания
Настройки шрифта устройства
Плохо отформатированная страница создания

Код, о котором идет речь, выглядит так, если он добавляет контекст:

 HorizontalPager(state = pagerState, dragEnabled = dragEnabled) { page ->
    val timeInSeconds = abs(steps[page % steps.size] / 1000L)
    val minutes = (timeInSeconds / 60).toString().padStart(2, '0')
    val seconds = (timeInSeconds % 60).toString().padStart(2, '0')

    Text(
        modifier = Modifier.fillMaxWidth(0.85f),
        text = stringResource(R.string.pomodoro_active_notification_content_body, minutes, seconds),
        textAlign = TextAlign.Center,
        fontSize = LocalDimens.current.intervalTimeFontSize,
        style = MaterialTheme.typography.h1
    )
}
 

Комментарии:

1. Вам нужно было бы указать размер шрифта dp вместо sp , и я уверен, что MaterialTheme это используется sp .

2. Если это единственный экран, к которому вы хотите применить это изменение кода, почему бы просто не объявить верхний уровень val и жестко закодировать размер экрана? Просто используйте AS, чтобы заменить все экземпляры старой ссылки на новый val, и я полагаю, что у вас все хорошо.

3. @CommonsWare составное Text не принимает dp , только TextUnit то, что является либо sp или em .

4. Да, я думаю, вам нужно выполнить некоторые преобразования, чтобы отменить масштаб текста. Предположим, вы хотите 16dp , чтобы у пользователя был масштаб текста 1,5 х. Если вы попробуете использовать 16.sp , вы получите 24dp реальный размер. Вы можете получить текущий масштаб текста ( LocalConfiguration IIRC). Итак, вы бы вычислили размер «против масштабирования» = 16 / 1,5 = 10,66 и применили .sp к нему, поэтому, когда будет применен масштаб текста, вы получите желаемый 16dp размер.

Ответ №1:

Как правильно указал @CommonsWare, вам необходимо изменить масштабирование.

Вы можете получить fontScale от LocalDensity :

 fontSize = with(LocalDensity.current) {
    (LocalDimens.current.intervalTimeFontSize / fontScale).sp
},
 

Комментарии:

1. Работает отлично, спасибо (и @CommonsWare)

2. Спасибо! Но было бы так просто, если бы они просто оставили доступность, чтобы установить dp для размера шрифта