标题栏三等分,如何实现标题栏文字居中,图标居左。

标题栏三等分,如何实现标题栏文字居中,图标居左。

HarmonyOS
2024-05-26 11:38:45
1319浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
truemichael

本文主要介绍关于标题栏的三等分布局,其中包括实现标题栏文字居中,图标居左。标题栏会应用在几乎所有页面,但根据页面需求会有不同的呈现方式。例如,标题栏是一个基础且标准的样式,标题居中,功能按钮居右。

使用的核心API

核心代码解释

1、 使用Row,column,Flexs,tack容器组件,设置子元素在主轴和交叉轴上的方向。

2、 设置子元素的宽度,当父容器大于/小于子组件宽度总和时,子组件按比例拉伸/收缩,分配父容器多余/不足空间。

3、 或通过position定位,设置目标元素左上角相对于父元素左上角位置。

@Extend(Column) 
function layout(align?: HorizontalAlign) { 
  .layoutWeight(1) 
  // 设置子组件在垂直方向上的对齐格式。默认值:FlexAlign.Start 
  .justifyContent(FlexAlign.Center) 
  // 设置子组件在水平方向上的对齐格式。 默认值:HorizontalAlign.Center 
  .alignItems(align || HorizontalAlign.Center) 
} 
 
@Entry 
@Component 
struct Page123 { 
  @State message: string = 'Hello World' 
  @State containerWidth: number = 402 
 
  // @Styles用于快速定义并复用自定义样式。 
  @Styles 
  pressedStyles() { 
    .backgroundColor("#ED6F21") 
  } 
 
  @Styles 
  normalStyles() { 
    .backgroundColor("#0A59F7") 
  } 
 
  @Styles 
  flex(){ 
    // 仅当父容器宽度大于所有子组件宽度的总和时,该属性生效。配置了此属性的子组件,按照比例拉伸,分配父容器的多余空间。默认值为0 
    .flexGrow(1) 
    // 仅当父容器宽度小于所有子组件宽度的总和时,该属性生效。配置了此属性的子组件,按照比例收缩,分配父容器的不足空间。 
    .flexShrink(1) 
    // flexBasis:设置子组件在父容器主轴方向上的基准尺寸。如果设置了该值,则子项占用的空间为设置的值;如果没设置该属性,那子项的空间为width/height的值。 
    // flexBasis属性不是必须的,通过width或height也可以达到同样的效果。当flexBasis属性与width或height发生冲突时,以flexBasis属性为准。 
    .flexBasis(1) 
  } 
 
  build() { 
    Column() { 
      Text(this.message) 
        .fontSize(20) 
        .stateStyles({ 
          normal: this.normalStyles, 
          pressed: this.pressedStyles, 
        }) 
 
 
      // Flex三等分 
      // 通过justifyContent参数设置在主轴方向的对齐方式,FlexAlign.Center子组件在主轴方向居中对齐 
      // 通过Flex组件的alignItems参数设置子组件在交叉轴的对齐方式,ItemAlign.Center交叉轴方向居中对齐 
      Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { 
        Column() 
          .flex() 
        Text(this.message).textAlign(TextAlign.Center).fontSize(14).flex() 
        Row() { 
          Image($r('app.media.app_icon')) 
            .width(20) 
            .height(20) 
            .margin({ right: 20 }) 
        }.justifyContent(FlexAlign.End) 
        .flex() 
      }.width('100%') 
      .height(40) 
 
      // position定位 
      Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { 
        Text(this.message).fontSize(14) 
        Image($r('app.media.app_icon')) 
          .width(20) 
          .height(20)// 目标元素左上角相对于父元素左上角位置 
          .position({ x: '100%', y: '50%' })//设置元素在位置定位时的锚点,以元素左上角作为基准点进行偏移 
          .markAnchor({ x: 40, y: '50%' }) 
      }.width('100%') 
      .height(40) 
      .backgroundColor(Color.Pink) 
 
      // 三等分实现 
      Row() { 
        Column() { 
          Image($r('app.media.app_icon')) 
            .width(20) 
            .height(20) 
            .margin({ left: 20 }) 
        }.layout(HorizontalAlign.Start) 
 
        Column() { 
          Text(this.message).fontSize(14) 
            .backgroundColor(Color.Pink) 
        }.layout(HorizontalAlign.Center) 
 
        Column() { 
          Image($r('app.media.app_icon')) 
            .width(20) 
            .height(20) 
            .margin({ right: 20 }) 
          //   设置布局在交叉轴的方向,交叉轴为水平方向时,取值为HorizontalAlign类型, 
        }.layout(HorizontalAlign.End) 
      } 
      // 设置布局在交叉轴的方向,交叉轴为垂直方向时,取值为VerticalAlign类型, 
      .alignItems(VerticalAlign.Center) 
      .height(46) 
      .width('100%') 
 
      // Stack方式 
      Stack() { 
        Row() { 
          Text(this.message).fontSize(14) 
        } 
        .width('100%') 
        // FlexAlign.Center:子组件在主轴方向中间对齐, 
        .justifyContent(FlexAlign.Center) 
 
        Row() { 
          Image($r('app.media.app_icon')) 
            .width(20) 
            .height(20) 
            .margin({ left: 20 }) 
        } 
        .width('100%') 
        .justifyContent(FlexAlign.Start) 
 
        Row() { 
          Image($r('app.media.app_icon')) 
            .width(20) 
            .height(20) 
            .margin({ right: 20 }) 
        } 
        .width('100%') 
        .justifyContent(FlexAlign.End) 
      }.width('100%') 
      .height(40) 
    } 
    .height('100%') 
    .width('100%') 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.

实现效果

适配版本信息

IDE:DevEco    Studio 4.0.1.501

SDK:HarmoneyOS    4.0.0.8

分享
微博
QQ
微信
回复
2024-05-27 11:53:21


相关问题
HarmonyOS 标题栏动画
637浏览 • 1回复 待解决
求问,原子化服务标题栏如何设置?
4452浏览 • 1回复 待解决
Atomic Service工程的标题栏是否能去除
2350浏览 • 1回复 待解决
元服务工程的标题栏是否能去除
2741浏览 • 1回复 待解决
HarmonyOS 文字标题没有垂直居中对齐
598浏览 • 1回复 待解决
HarmonyOS 如何动态设置导航title标题
622浏览 • 1回复 待解决