#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 для размера шрифта