pref(Texts.kt): Compose Text 支持显示两个图标

This commit is contained in:
HuanCheng65 2023-03-11 00:10:33 +08:00
parent 8db3645d9f
commit 87b7e8339a
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
1 changed files with 109 additions and 1 deletions

View File

@ -1,16 +1,24 @@
package com.huanchengfly.tieba.post.ui.widgets.compose package com.huanchengfly.tieba.post.ui.widgets.compose
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentAlpha import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor import androidx.compose.material.LocalContentColor
import androidx.compose.material.LocalTextStyle import androidx.compose.material.LocalTextStyle
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AccountCircle
import androidx.compose.material.icons.rounded.Link
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.takeOrElse import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.Placeholder
import androidx.compose.ui.text.PlaceholderVerticalAlign
import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
@ -20,6 +28,11 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.huanchengfly.tieba.post.R
import com.huanchengfly.tieba.post.pxToDp
import com.huanchengfly.tieba.post.pxToSp
import com.huanchengfly.tieba.post.utils.EmoticonManager import com.huanchengfly.tieba.post.utils.EmoticonManager
import com.huanchengfly.tieba.post.utils.EmoticonManager.getEmoticonHeightPx import com.huanchengfly.tieba.post.utils.EmoticonManager.getEmoticonHeightPx
import com.huanchengfly.tieba.post.utils.EmoticonUtil.emoticonString import com.huanchengfly.tieba.post.utils.EmoticonUtil.emoticonString
@ -108,7 +121,7 @@ fun EmoticonText(
val sizePx = getEmoticonHeightPx(mergedStyle) val sizePx = getEmoticonHeightPx(mergedStyle)
val emoticonInlineContent = val emoticonInlineContent =
remember(sizePx) { EmoticonManager.getEmoticonInlineContent(sizePx) } remember(sizePx) { EmoticonManager.getEmoticonInlineContent(sizePx) }
Text( IconText(
text, text,
modifier, modifier,
color, color,
@ -128,3 +141,98 @@ fun EmoticonText(
style style
) )
} }
@Composable
fun IconText(
text: AnnotatedString,
modifier: Modifier = Modifier,
color: Color = Color.Unspecified,
fontSize: TextUnit = TextUnit.Unspecified,
fontStyle: FontStyle? = null,
fontWeight: FontWeight? = null,
fontFamily: FontFamily? = null,
letterSpacing: TextUnit = TextUnit.Unspecified,
textDecoration: TextDecoration? = null,
textAlign: TextAlign? = null,
lineHeight: TextUnit = TextUnit.Unspecified,
overflow: TextOverflow = TextOverflow.Clip,
softWrap: Boolean = true,
maxLines: Int = Int.MAX_VALUE,
inlineContent: Map<String, InlineTextContent> = emptyMap(),
onTextLayout: (TextLayoutResult) -> Unit = {},
style: TextStyle = LocalTextStyle.current
) {
val textColor = color.takeOrElse {
style.color.takeOrElse {
LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
}
}
val mergedStyle = style.merge(
TextStyle(
color = textColor,
fontSize = fontSize,
fontWeight = fontWeight,
textAlign = textAlign,
lineHeight = lineHeight,
fontFamily = fontFamily,
textDecoration = textDecoration,
fontStyle = fontStyle,
letterSpacing = letterSpacing
)
)
val sizePx = getEmoticonHeightPx(mergedStyle)
val sizeSp = sizePx.pxToSp().sp
val sizeDp = sizePx.pxToDp().dp
val iconInlineContent =
remember(sizeSp) {
mapOf(
"link_icon" to InlineTextContent(
placeholder = Placeholder(
width = sizeSp,
height = sizeSp,
placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter
),
children = {
Icon(
Icons.Rounded.Link,
contentDescription = stringResource(id = R.string.link),
modifier = Modifier.size(sizeDp)
)
}
),
"user_icon" to InlineTextContent(
placeholder = Placeholder(
width = sizeSp,
height = sizeSp,
placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter
),
children = {
Icon(
Icons.Rounded.AccountCircle,
contentDescription = stringResource(id = R.string.user),
modifier = Modifier.size(sizeDp)
)
}
),
)
}
Text(
text,
modifier,
color,
fontSize,
fontStyle,
fontWeight,
fontFamily,
letterSpacing,
textDecoration,
textAlign,
lineHeight,
overflow,
softWrap,
maxLines,
iconInlineContent + inlineContent,
onTextLayout,
style
)
}