子组件溢出父容器问题

解决子组件溢出父容器的场景,目前子组件允许超出父组件,但希望子组件不要溢出父组件。

HarmonyOS
2024-05-23 23:38:33
1131浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
快乐小肥仔

使用的核心API

measure

measure.measureTextSize:计算指定文本单行布局下的宽度和高度。

onAreaChange组件区域变化事件,组件区域变化时触发该回调。仅会响应由布局变化所导致的组件大小、位置发生变化时的回调。

核心代码解释

import measure from '@ohos.measure'; 
  
@Entry 
@Component 
struct Text1 { 
  @State message: string = ''; 
  @State contentHeight: number = 50 
  @State textWidth: number = 0 
  normalSize: SizeOptions = measure.measureTextSize({ 
    textContent: "x", 
    fontSize: 12, 
    constraintWidth: 200 
  }) 
  @State lines: number = 1 
  @State maxWidth: number = 500 
  @State crossContent: string = "" 
  @State crossWidth: number = 0; 
  aboutToAppear() { 
    this.setMessage() 
  } 
  setMessage() { 
    //场景1,message小,cross小 
    this.message = "1" 
    this.crossContent = "1" 
    //场景2,message大,cross小 
    this.message = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111" 
    this.crossContent = "1" 
  
    //场景3,message大,cross大 
    this.message = "sdfsdfsdfdsffddsfds11111111111111111111111" 
    this.crossContent = "11111111111111111111111111111111111111111111111111" 
  
    //场景4,message小,cross大 
    this.message = "1" 
    this.crossContent = "11111111111111111111111111111111111111111111111111" 
  } 
  build() { 
    Column() { 
      Row() { 
        Row() { 
          Text(this.message) 
            .fontColor('#212121') 
            .fontSize(12) 
            .textAlign(TextAlign.Start) 
            .fontWeight(500) 
            .maxLines(2) 
            .textOverflow({ overflow: TextOverflow.Ellipsis }) 
            .onAreaChange((oldArea: Area, newArea: Area) => { 
              if (typeof newArea.width == 'number') { 
                this.textWidth = newArea.width 
                let size: SizeOptions = measure.measureTextSize({ 
                  textContent: this.message, 
                  fontSize: 12, 
                  constraintWidth: this.textWidth 
                }) 
                if(size.height !=undefined && this.normalSize.height !=undefined){ 
                  if (size.height > this.normalSize.height) { 
                    this.lines = 2 
                  } else { 
                    this.lines = 1 
                  } 
                } 
              } 
            }) 
            .constraintSize({ 
              maxWidth: this.maxWidth 
            }) 
        }.clip(true) 
        .layoutWeight(this.lines - 1) 
        .onAreaChange((oldArea: Area, newArea: Area) => { 
          if (typeof newArea.height == 'number') { 
            this.contentHeight = newArea.height 
          } 
        }) 
  
        Column() { 
          Text(this.crossContent) 
            .fontColor('#00bcd4') 
            .fontSize(10) 
            .margin({ left: 2 }) 
            .textOverflow({ overflow: TextOverflow.Ellipsis }) 
            .onAreaChange((oldArea: Area, newArea: Area) => { 
              if (typeof newArea.width == 'number') { 
                this.crossWidth = newArea.width 
              } 
            }) 
        }.height(this.contentHeight) 
      }.backgroundColor(Color.Orange) 
      .onAreaChange((oldArea: Area, newArea: Area) => { 
        if (typeof newArea.width == 'number') { 
          this.maxWidth = newArea.width - this.crossWidth 
        } 
      }) 
    } 
    .margin({ top: 12, bottom: 0, left: 12, right: 12 }) 
    .padding(4) 
  } 
}
  • 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.

实现效果

场景1:message小,cross小

场景2:message大,cross小

场景3:message大,cross大

场景4:message小,cross大

适配版本信息

SDK:4.1.0.52

IDE:DevEco Studio 4.1.1.400

分享
微博
QQ
微信
回复
2024-05-24 23:26:06
相关问题
HarmonyOS 容器如何撑满容器
1371浏览 • 1回复 待解决
如何隐藏容器组件溢出内容
3410浏览 • 1回复 待解决
组件高度为0时,如何设置溢出隐藏
1876浏览 • 1回复 待解决
组件调用组件的方法
2255浏览 • 1回复 待解决
组件组件传递函数
1030浏览 • 1回复 待解决
组件调用组件里的方法
1143浏览 • 1回复 待解决
HarmonyOS 组件超出组件宽度
874浏览 • 1回复 待解决
HarmonyOS 组件超出组件布局
882浏览 • 1回复 待解决
HarmonyOS 组件调用组件方法
918浏览 • 1回复 待解决
组件组件使用@Link双向同步
2095浏览 • 1回复 待解决
设置组件的宽度不超出组件
1335浏览 • 1回复 待解决
HarmonyOS 组件怎么调用组件的方法
1260浏览 • 1回复 待解决
HarmonyOS 组件调用组件的方法demo
890浏览 • 1回复 待解决
组件的事件可以传到组件
1487浏览 • 1回复 待解决
HarmonyOS TextInput超出容器
428浏览 • 1回复 待解决