鸿蒙Column,Row,线性布局,Text组件的详细说明

组件

今天是发布鸿蒙的第1篇文章。别人五一出去旅游,我五一学鸿蒙。
下面我我们主要讲一下:Column,Row,Text组件
容器组件:Column(列)、Row(行)
列组件的排列方式:从上到下排序。行组件的排列从左到右进行排列
文本组件:Text
特别:注意鸿蒙中的组件默认都是首字母大写的哈

1行2列

@Entry
@Component
struct Index {
  @State message: string = '开始学习鸿蒙了';
  build() { // 表示开始进行构建界面
    Row(){ // 行
      Column() { // 列
        Text('吞噬星空')
      }
      Column(){ // 列
        Text('罗峰') 
        Text('徐昕')
      }
    }
  }
}

build下只能有一个子组件

@Entry
@Component
struct Index {
  // 现在build中有2个组件,这样会报错的。
  build() { // 表示开始进行构建界面
    Column(){
      Row() {
        Text('吞噬星空')
      }
    }
    Column(){

    }
  }
}

报错信息:
In an '@Entry' decorated component,
the 'build' function can have only one root node, which must be a container component.

Column列中的子元素默认是水平居中的

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ //Column(列) 使用之后,里面的元素默认是水平居中的
      //行中设置一个文本内容
      Row() {
        Text('吞噬星空')
      }
      Row(){
        Text('罗峰')
        Text('徐昕')
        Text('姑妈')
        Text('秃鹫')
        Text('路人')
        Text('路人2')
        Text('路人3')
      }
      // 给这个列设置背景颜色
    }.backgroundColor("#ccc").width('100%')
  }
}

如何让Column下的子元素左对齐

Column会让里面的子元素(Text,Row)水平居中。
如果我想让他们左对齐怎么操作:
给Column下的子组件Row设置宽度,如设置100%

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ //Column(列) 使用之后,里面的元素默认是水平居中的
      // 行中设置一个文本内容
      Row() {
        Text('吞噬星空')
      }.width('100%')
      Row(){
        Text('罗峰')
        Text('徐昕')
        Text('姑妈')
        Text('秃鹫')
        Text('路人')
        Text('路人2')
        Text('路人3')
      }.width('100%')
    }
  }
}

Row和Text的相关属性(宽,高,字体大小,加粗,颜色)

Column和Row常用的属性有:宽,高,背景色backgroundColor

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ //Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      //行中设置一个文本内容
      Row() {
        // Text设置宽度后不会默认居中了。不设置会默认居中
        // 关于fontWeight,数值100-900(100的整数倍) 加粗是700 默认是400
        Text('吞噬星空').fontSize(20).fontWeight(700)
      }.width('100%').height(40)
      Row(){
        Text('罗峰').width(50).height(30).backgroundColor(Color.Pink)
        Text('徐昕').width(50).height(30).backgroundColor(Color.Orange)
        Text('姑妈').width(50).height(30).backgroundColor(Color.Red)
        Text('秃鹫').width(50).height(30).backgroundColor(Color.Green)
      }.width('100%')
      // 给这个列设置背景颜色,列宽100%(铺满整个屏幕)
    }.backgroundColor("#ccc").width('100%')
  }
}

Text常用的属性

宽,高,背景色backgroundColor,
字体加粗fontWeight:数值100-900(100的整数倍)
行高:lineHeight(22) lineHeight(value: number | string | Resource)
number类型时单位为fp。string类型支持number类型取值的字符串形式,可以附带单位,例如"10"、"10fp"。
fontSize设置字体大小

如果想看Text组件的详细属性。可以访问:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-text#示例1设置文本布局

设置文本超长显示方式的注意点

textOverflow(value: { overflow: TextOverflow })
当overflow设置为TextOverflow.None、TextOverflow.Clip、TextOverflow.Ellipsis时,需配合maxLines使用,单独设置不生效。
设置TextOverflow.None与TextOverflow.Clip效果一样

maxLines:设置文本的最大行数

maxLines:设置文本的最大行数。
默认情况下,文本是自动折行的,如果指定此属性,则文本最多不会超过指定的行。
可以通过textOverflow来指定截断方式。

lineHeight(value: number | string | Resource):设置文本的文本行高

lineHeight:设置文本的文本行高。
设置值不大于0时,不限制文本行高,自适应字体大小。
number类型时单位为fp。string类型支持number类型取值的字符串形式,可以附带单位,例如"10"、"10fp"。

Text超出显示省略号

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ // Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      //行中设置一个文本内容
      Row() {
        Text('HarmonyOS SDK').width('100%').height(40).fontSize(20).fontWeight(700)
      }
      Row() {
        Text('HarmonyOS SDK 是面向鸿蒙应用和元服务开发的开放能力合集,提供包括应用框架、应用服务、系统、AI、媒体,带来创新易用的全场景体验。')
          .width('100%')
          .lineHeight(22)
          // 文本超出2行显示省略号
          .textOverflow({
            overflow: TextOverflow.Ellipsis
          }).maxLines(2)
      }
    }
  }
}

还可以这样写,1列中放置2个Text文本,使用width('100%')让他们换行

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ // Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      //行中设置一个文本内容
      Text('HarmonyOS SDK').width('100%').height(40).fontSize(20).fontWeight(700)
      Text('HarmonyOS SDK 是面向鸿蒙应用和元服务开发的开放能力合集,提供包括应用框架、应用服务、系统、AI、媒体,带来创新易用的全场景体验。')
        .width('100%')
        .lineHeight(22)
          // 文本超出2行显示省略号
        .textOverflow({
          overflow: TextOverflow.Ellipsis
        }).maxLines(2)
    }
  }
}


总结:2个Text组件可以直接放在一起,设置宽度100%。这样他们会进行换行。

文字超出1行裁剪(不显示省略号)

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ // Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      //行中设置一个文本内容
      Row() {
        Text('HarmonyOS SDK').width('100%').height(40).fontSize(20).fontWeight(700)
      }
      Row() {
        Text('HarmonyOS SDK 是面向鸿蒙应用和元服务开发的开放能力合集,提供包括应用框架、应用服务、系统、AI、媒体,带来创新易用的全场景体验。')
          .width('100%')
          .lineHeight(22)
            // 文本超出1行的内容直接裁剪掉(用的少)
          .textOverflow({
            // 还可以使用 overflow: TextOverflow.None 他们的效果是一样的
            overflow: TextOverflow.Clip 
          }).maxLines(1)
      }
    }
  }
}

单行从右向左滚动

@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ // Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      //行中设置一个文本内容
      Row() {
        Text('HarmonyOS SDK').width('100%').height(40).fontSize(20).fontWeight(700)
      }
      Row() {
        Text('HarmonyOS SDK 是面向鸿蒙应用和元服务开发的开放能力合集,提供包括应用框架、应用服务、系统、AI、媒体,带来创新易用的全场景体验。')
          .width('100%')
          .lineHeight(22)
            // 单行从右向左滚动,此时maxLines属性就不需要了
          .textOverflow({
            overflow: TextOverflow.MARQUEE
          })
      }
    }
  }
}


当overflow设置为TextOverflow.MARQUEE时,文本在一行内滚动显示,设置maxLines及copyOption属性均不生效。
在文本不可滚动时,设置textAlign属性生效; 在文本可滚动时,设置textAlign属性不生效。
在跑马灯模式下,Text组件clip属性默认为true。属性字符串的CustomSpan不支持跑马灯模式。

textAlign:设置文本段落在水平方向的对齐方式。

textAlign(TextAlign.End) 默认,左对齐
textAlign(TextAlign.Center) 居中对齐
textAlign(TextAlign.End) 右对齐
两端对齐如下:
textAlign(TextAlign.JUSTIFY) 两端对齐,需配合wordBreak属性,最后一行左对齐。

decoration 设置文本装饰线样式及其颜色。

 Text("镇魂街").width('100%').fontSize(20).decoration({
  type: TextDecorationType.Underline, //设置显示下划线
  color: Color.Pink,
  style: TextDecorationStyle.SOLID // SOLID实线、你可以调整线样式
})

如何设置下划线距离文本的距离呢?

鸿蒙并没有直接提供这样的API
但是我们可以间接的来实现这个需求

import { LengthUnit } from '@kit.ArkUI'
@Entry
@Component
struct Index {
  build() { // 表示开始进行构建界面
    Column(){ // Column(列) 使用之后,里面的元素默认是水平居中的,解决办法子元素设置 width
      Text("镇魂街").width('100%').fontSize(20).decoration({
        type: TextDecorationType.Underline, //设置显示下划线
        color: Color.Pink, // 下划线的颜色
        style: TextDecorationStyle.SOLID // SOLID实线、你可以调整线样式
      }).lineSpacing({ value:62, unit:LengthUnit.VP})
    //   这个是一个方式,但是设置了之后会对text得高有影响
    }
  }
}

线性布局

线性布局(LinearLayout)通过线性容器 Column 和 Row 创建。
Row 容器:子元素 水平方向 排列,我们通常叫做行列元素
Column 容器:子元素,垂直方向排列,我们通常叫做:列元素
特别注意:如果最大的容器是Row,我们的主轴就是Row。如果最大的容器是Column,我们的主轴就是Column。
build下只能有一个子元素。这个子元素就是我们的主轴

justifyContent是设置主轴(垂直方向 || 水平方向)上的对齐方式,它的取值一般有下面这几个值

FlexAlign.End 在最末端;
FlexAlign.Center在中间;
FlexAlign.Start在最起始位置;
FlexAlign.SpaceBetween 两端紧挨着,中间均匀分布。与css3的一样。
FlexAlign.SpaceAround 两端有一点间距(0.5),中间间距(1)均匀分布。与css3的一样。
FlexAlign.SpaceEvenly 间隙是均匀的。

主轴为列Column,元素两端紧挨着,中间均匀分布。

在使用justifyContent的时候时候,我们一般让主轴的空间是100%。

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row() {
        Text("第1个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
      Row() {
        Text("第2个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
      Row() {
        Text("第3个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
    }.width('100%').height('100%').justifyContent(FlexAlign.Center)
  } 
}

主轴为列Column,元素两端紧挨着,中间均匀分布。

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row() {
        Text("第1个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
      Row() {
        Text("第2个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
      Row() {
        Text("第3个").width('100%').height(100).fontColor('#fff').backgroundColor(Color.Pink)
      }
    }.width('100%').height('100%').justifyContent(FlexAlign.SpaceBetween)
  }
}

主轴为行Row,元素显示在末端。

@Entry
@Component
struct Index {
  build() {
    Row() {
        Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
        Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
        Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.width('100%').justifyContent(FlexAlign.End) // 在末端
  }
}

主轴为行Row,元素均匀分布

@Entry
@Component
struct Index {
  build() {
    Row() {
        Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
        Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
        Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.width('100%').justifyContent(FlexAlign.SpaceEvenly) // 间隙是均匀的
  }
}

主轴为行Row,两端有一点间距(0.5),中间间距(1)均匀分布

@Entry
@Component
struct Index {
  build() {
    Row() {
        Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
        Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
        Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.width('100%').justifyContent(FlexAlign.SpaceAround) // FlexAlign.SpaceAround 两端有一点间距(0.5),中间间距(1)均匀分布。与css3的一样。
  }
}

实现小红书顶部的简陋效果

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row(){
         Image($r('app.media.more')).width(22)
         Row(){
            Text('关注').margin({ right: 5})
            Text('发现').margin({ right: 5})
            Text('附近').margin({ right: 5})
         }
        Image($r('app.media.search')).width(22)
      }.width('100%').height(40)
       .justifyContent(FlexAlign.SpaceBetween)
       .padding({left:10, right:10})
    }
  }
}
// 我们想让元素在Row中两端对齐,中间均匀分布.前提是:需要让主轴宽度设置为100%;width('100%')
// 使用justifyContent(FlexAlign.SpaceBetween)后,如果我们想要让两端有间距,可以使用.padding({left:10, right:10})
// 图标使用Image($r('app.media.more'))引入后,默认是显示图标实际的大小,因此需要给图标设置width

交叉轴的对齐方式

交叉轴:交叉轴就是和主轴垂直的那个方向。

需要注意:我们在设置交叉轴的时候
如:Column的交叉轴水平向右,我们需要设置Column().width('100%')
下面是水平向右的交叉轴的取值
HorizontalAlign.Start 居左
HorizontalAlign.Center 居中
HorizontalAlign.End 居右

如:Row的交叉轴垂直往下,,我们需要设置Column().height('100%')
垂直往下的交叉轴的取值
VerticalAlign.Top 顶部
VerticalAlign.Center 居中
VerticalAlign.Bottom 底部

Column的交叉轴水平向右:alignItems(HorizontalAlign.Start) 居左
@Entry
@Component
struct Index {
  build() {
    Column() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').width('100%').alignItems(HorizontalAlign.Start)
  }
}

Column的交叉轴水平向右:alignItems(HorizontalAlign.Center) 居中
@Entry
@Component
struct Index {
  build() {
    Column() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').width('100%').alignItems(HorizontalAlign.Center)
  }
}

Column的交叉轴水平向右:alignItems(HorizontalAlign.End) 居右
@Entry
@Component
struct Index {
  build() {
    Column() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').width('100%').alignItems(HorizontalAlign.End)
  }
}

Row的交叉轴:垂直往下的方向上:顶部
@Entry
@Component
struct Index {
  build() {
    Row() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').alignItems(VerticalAlign.Top)
  }
}

Row的交叉轴:垂直往下的方向上:居中
@Entry
@Component
struct Index {
  build() {
    Row() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').alignItems(VerticalAlign.Center)
  }
}

Row的交叉轴:垂直往下的方向上:底部
@Entry
@Component
struct Index {
  build() {
    Row() {
      Text("第1个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Pink)
      Text("第2个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Black)
      Text("第3个").width(100).height(100).fontColor('#fff').backgroundColor(Color.Brown)
    }.height('100%').alignItems(VerticalAlign.Bottom)
  }
}

自适应布局

自适应布局:设置 layoutWeight属性的元素,将会与兄弟元素按照权重进行分配主轴剩余的空间。
或者说:自适应布局会先把固定空间排列好,剩下的空间会按照权重来进行分配
语法是:组件.layoutWeight(数字)

自适应布局:1行3列的效果

@Entry
@Component
struct Index {
  build() {
    Column() {
      Row(){
        Column(){
          Row(){
            Text('玩一玩').fontSize(22).fontWeight(600)
          }.width('100%')
          Row(){
           Text('签到兑礼').margin({right:5})
           Text('超多大奖').margin({right:5})
           Text('超好玩').margin({right:5})
          }.width('100%')
        }.layoutWeight(1)

        Column(){
          Image($r('app.media.hongmeng')).width(70).height(70).backgroundImageSize(ImageSize.Cover)
        }.margin({right:10})

        Column(){
          Image($r('app.media.right')).width(20)
        }
      }.width('100%').height(80).backgroundColor(Color.Pink).padding({left:4, right:4})
    }
  }
}

posted @ 2025-05-25 10:30  何人陪我共长生  阅读(154)  评论(0)    收藏  举报