Android Jetpack Compose 之 Text

官方教程

下載Android Studio Canary版本

環(huán)境

添加依賴:

    def compose_version = "0.1.0-dev03"

    kapt("androidx.compose:compose-compiler:$compose_version")
    implementation("androidx.compose:compose-runtime:$compose_version")
    implementation("androidx.ui:ui-core:$compose_version")
    implementation "androidx.ui:ui-tooling:$compose_version"
    implementation("androidx.ui:ui-layout:$compose_version")
    implementation("androidx.ui:ui-framework:$compose_version")
    implementation("androidx.ui:ui-material:$compose_version")
    implementation("androidx.ui:ui-foundation:$compose_version")
    implementation("androidx.ui:ui-text:$compose_version")

androidx.ui.core中的Composable Text組件為我們提供了一系列的屬性來(lái)控制文本的外觀矾克。

@Composable
fun Text(
    text: String,
    modifier: Modifier = Modifier.None,
    style: TextStyle? = null,
    paragraphStyle: ParagraphStyle? = null,
    softWrap: Boolean = DefaultSoftWrap,
    overflow: TextOverflow = DefaultOverflow,
    maxLines: Int? = DefaultMaxLines
) {
    Text(
        text = AnnotatedString(text),
        modifier = modifier,
        style = style,
        paragraphStyle = paragraphStyle,
        softWrap = softWrap,
        overflow = overflow,
        maxLines = maxLines
    )
}

基本屬性

softWrap

聲明是否應(yīng)在換行符處斷開文本

overflow

組件中溢出文本

省略號(hào)


image

淡入淡出


image
@Preview
@Composable
fun initLayout() {
    // 定義一個(gè)有寬度的容器
    Container (
        width = Dp(80f)
    ){
        Text(
            text = "1234567890asdfgh",
            softWrap = false,
            maxLines = 1,
            overflow = TextOverflow.Fade
        )
    }
}

文本樣式

在定義文本組件的樣式屬性時(shí)萨蚕,我們需要使用TextStyle類的實(shí)例

@Immutable
data class TextStyle(
    // 文本顏色
    val color: Color? = null,
    // Sp 字體大小
    val fontSize: TextUnit = TextUnit.Inherit,
    // 文本粗細(xì)
    val fontWeight: FontWeight? = null,
    // 文本樣式 Normal或Italic
    val fontStyle: FontStyle? = null,
    // 文本字體手動(dòng)合成粗體/斜體樣式
    val fontSynthesis: FontSynthesis? = null,
    // 文本字體
    val fontFamily: FontFamily? = null,
    // 字體的高級(jí)排版設(shè)置
    val fontFeatureSettings: String? = null,
    //  字符之間的間距
    val letterSpacing: TextUnit = TextUnit.Inherit,
    // 從文本基線開始使用的垂直移位
    val baselineShift: BaselineShift? = null,
    // 文本幾何變換  
    val textGeometricTransform: TextGeometricTransform? = null,
    // 特定語(yǔ)言環(huán)境的文本
    val localeList: LocaleList? = null,
    //  文本背景色
    val background: Color? = null,
    // 在文本的某處繪制水平線 None Underline LineThrough
    val decoration: TextDecoration? = null,
    // 要在文本上繪制的陰影
    val shadow: Shadow? = null
)

段落樣式

ParagraphStyle類

data class ParagraphStyle constructor(
    // 文本對(duì)齊方式 LEFT否过、START锹淌、RIGHT传趾、END、CENTER绎橘、JUSTIFY
    val textAlign: TextAlign? = null,
    // 枚舉類設(shè)置文本顯示方向
    val textDirectionAlgorithm: TextDirectionAlgorithm? = null,
    // 文本行高
    val lineHeight: Sp? = null,
    // 文本縮進(jìn)
    val textIndent: TextIndent? = null
)

多樣化文本

/**
 * The basic data structure of text with multiple styles. To construct an [AnnotatedString] you
 * can use [Builder].
 */
data class AnnotatedString(
    val text: String,
    val textStyles: List<Item<TextStyle>> = listOf(),
    val paragraphStyles: List<Item<ParagraphStyle>> = listOf()
)

例如:

@Composable
fun initLayout() {
    // 定義一個(gè)有寬度的容器
    Container (
        width = Dp(80f)
    ){
        val annotatedString = AnnotatedString.Builder("1234567890asdfgh")
            .apply {
                addStyle(TextStyle(color = Color.Red), 0, 3)
            }

        Text(
            text = annotatedString.toAnnotatedString(),
            softWrap = false,
            maxLines = 1,
            overflow = TextOverflow.Fade
        )
    }
}

添加和刪除樣式

  • pushStyle:將TextStyle添加到AnnotatedText中,該樣式將應(yīng)用于推入樣式后附加的任何文本返回樣式的索引捺氢。
  • pushStyle: 將ParagraphStyle添加到AnnotatedText中
  • popStyle: 從AnnotatedText中刪除以前添加的樣式
  • popStyle: 從AnnotatedText中刪除指定索引處的樣式
@Preview
@Composable
fun initLayout() {
    // 定義一個(gè)有寬度的容器
    Container (
        width = Dp(150f),
        alignment =  Alignment.CenterLeft

    ){
        val style = TextStyle(color = Color.Red,background = Color.White)
        val annotatedString = AnnotatedString.Builder("123456")
        annotatedString.pushStyle(style)
        annotatedString.append(", aaaaaa")
        // 去掉樣式
        annotatedString.popStyle()
        annotatedString.append("cccccc.")
        Text(text = annotatedString.toAnnotatedString(), maxLines = 1)
    }

}

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摄乒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斋否,更是在濱河造成了極大的恐慌拭荤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旦委,死亡現(xiàn)場(chǎng)離奇詭異雏亚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罢低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門网持,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人功舀,你說(shuō)我怎么就攤上這事×星茫” “怎么了莉擒?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瘫絮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鹿鳖,道長(zhǎng)壮莹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任涝滴,我火速辦了婚禮,結(jié)果婚禮上歼疮,老公的妹妹穿的比我還像新娘。我一直安慰自己缩麸,他們只是感情好赡矢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弧械,像睡著了一般送浊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袭景,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天耸棒,我揣著相機(jī)與錄音,去河邊找鬼与殃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛米奸,可吹牛的內(nèi)容都是我干的爽篷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泪喊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哈扮,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎育八,沒想到半個(gè)月后赦邻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡按声,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年签则,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铐料。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柒凉,死狀恐怖篓跛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧沟,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布林艘,位于F島的核電站混坞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咕村。R本人自食惡果不足惜蚊俺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一逛万、第九天 我趴在偏房一處隱蔽的房頂上張望批钠。 院中可真熱鬧得封,春花似錦、人聲如沸拷呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至慷彤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間底哗,已是汗流浹背跋选。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留属划,地道東北人候生。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓唯鸭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親目溉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 探索 Android 中的 Span 在 Android 中,使用 Span 定義文本的樣式. 通過 Span 改...
    TonnyL閱讀 6,103評(píng)論 2 14
  • ??DOM 1 級(jí)主要定義的是 HTML 和 XML 文檔的底層結(jié)構(gòu)足陨。 ??DOM2 和 DOM3 級(jí)則在這個(gè)結(jié)構(gòu)...
    霜天曉閱讀 1,442評(píng)論 1 3
  • Can't get dom width or height echarts解決方案 var mainContain...
    飛豹豹豹豹豹閱讀 1,574評(píng)論 0 0
  • 今天就爬華山墨缘,從早上就很幸運(yùn)星虹,農(nóng)家樂的哥哥去買菜镊讼,就免費(fèi)送我們到了山腳的地方。(*ˉ︶ˉ*) 去華山的路只有一條狠毯,...
    愛看書的西瓜閱讀 261評(píng)論 0 2