gpt4 book ai didi

android - Jetpack Compose,没有字体填充的居中文本?

转载 作者:行者123 更新时间:2023-12-04 11:14:18 34 4
gpt4 key购买 nike

我正在为 Jetpack Compose 版本 alpha-11 中的垂直居中文本而苦苦挣扎。看来我的字体有大量填充,我无法找到禁用它的方法。据我所知,这在 SO 上只出现过一次,here ,但他们对使用约束布局的回答似乎表明他们只是绝对定位它,这与其说是一种解决方案不如说是一种解决方法,也是我想避免的事情。
您可以在下面的屏幕截图中清楚地看到它。
enter image description here
代码如下所示:

                   Column(verticalArrangement = Arrangement.Center) {
Text(
text = "Let's Go",
color = Color.White,
fontSize = 120.sp,
fontFamily = oswaldLightFontFamily(),
textAlign = TextAlign.Center,
modifier = Modifier.background(Color.Blue)
)
}
你期望定位它的参数—— verticalArrangementtextAlign - 不要在这里做任何事情,但我将它们包括在内以展示我尝试过的内容。
到目前为止,我的解决方法是使用 Modifier.graphicsLayer(translationY = -25f)将其向上移动,但这对于应该如此简单的事情来说似乎是一个可怕的黑客攻击。看来,在经典的 Android 布局中,可以设置 android:includeFontPadding="false"这将绕过这种行为,但 Jetpack Compose 中似乎没有类似的选项。
有人遇到这种情况吗?

最佳答案

根据https://issuetracker.google.com/issues/171394808 , 这似乎是当前 JetPack Compose 的限制之一。
这也是我的应用程序的交易破坏者,因为使用的字体严重依赖 includeFontPadding .对于当前的解决方法,我创建了一个 CoreText,它将 TextView 包装在我的 compose 中。
这是我的包装器的示例,它并不完美,但它可以满足我当前的用例:

@Composable
fun CoreText(
text: String,
modifier: Modifier = Modifier,
color: Color = Color.Unspecified,
textDecoration: TextDecoration? = null,
textAlign: TextAlign? = null,
overflow: TextOverflow = TextOverflow.Clip,
maxLines: Int = Int.MAX_VALUE,
style: TextStyle = Typography.body2,
onClick: (() -> Unit)? = null,
) {
AndroidView(
modifier = modifier,
factory = { context ->
TextView(context)
},
update = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
it.setTextAppearance(style.fontWeight.toStyle())
} else {
it.setTextAppearance(it.context, style.fontWeight.toStyle())
}

if (overflow == TextOverflow.Ellipsis) {
it.ellipsize = TextUtils.TruncateAt.END
}

if (textDecoration != null) {
it.paintFlags = when (textDecoration) {
TextDecoration.Underline -> {
Paint.UNDERLINE_TEXT_FLAG
}
TextDecoration.LineThrough -> {
Paint.STRIKE_THRU_TEXT_FLAG
}
else -> 0
}
}

if (onClick != null) {
it.setOnClickListener { onClick.invoke() }
}

if (color != Color.Unspecified || style.color != Color.Unspecified) {
it.setTextColor(if (color == Color.Unspecified) style.color.toArgb() else color.toArgb())
}

it.textSize = style.fontSize.value
it.text = text
it.background = ColorDrawable(style.background.toArgb())
it.maxLines = maxLines
it.includeFontPadding = false
it.textAlignment = textAlign?.toStyle() ?: style.textAlign.toStyle()
}
)
}

// Replace with your style
fun FontWeight?.toStyle(): Int {
return when (this) {
FontWeight.Bold -> R.style.TextStyle_Bold
FontWeight.Normal -> R.style.TextStyle_Regular
FontWeight.Medium, FontWeight.SemiBold -> R.style.TextStyle_Medium
else -> -1
}
}

fun TextAlign?.toStyle(): Int {
return when (this) {
TextAlign.Left -> TEXT_ALIGNMENT_TEXT_START
TextAlign.Right -> TEXT_ALIGNMENT_TEXT_END
TextAlign.Center -> TEXT_ALIGNMENT_CENTER
TextAlign.Start -> TEXT_ALIGNMENT_TEXT_START
TextAlign.End -> TEXT_ALIGNMENT_TEXT_END
else -> -1
}
}

关于android - Jetpack Compose,没有字体填充的居中文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66126551/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com