HarmonyOS(47) onSizeChange和onAreaChange

onSizeChange和onAreaChange

onSizeChange

组件区域变化时触发该回调。仅会响应由布局变化所导致的组件尺寸 发生变化时的回调。由绘制变化所导致的渲染属性变化不会响应回调,如translate、offset。

java 复制代码
// xxx.ets
@Entry
@Component
struct AreaExample {
  @State value: string = 'Text'
  @State sizeValue: string = ''

  build() {
    Column() {
      Text(this.value)
        .backgroundColor(Color.Green)
        .margin(30)
        .fontSize(20)
        .onClick(() => {
          this.value = this.value + 'Text'
        })
        .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
          console.info(`Ace: on size change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
          this.sizeValue = JSON.stringify(newValue)
        })
      Text('new area is: \n' + this.sizeValue).margin({ right: 30, left: 30 })
    }
    .width('100%').height('100%').margin({ top: 30 })
  }
}

onAreaChange

组件区域 变化时触发该回调。仅会响应由布局变化所导致的组件大小、位置发生变化时的回调。由绘制变化所导致的渲染属性变化不会响应回调,如translate、offset。

dart 复制代码
// xxx.ets
@Entry
@Component
struct AreaExample {
  @State value: string = 'Text'
  @State sizeValue: string = ''

  build() {
    Column() {
      Text(this.value)
        .backgroundColor(Color.Green)
        .margin(30)
        .fontSize(20)
        .onClick(() => {
          this.value = this.value + 'Text'
        })
        .onAreaChange((oldValue: Area, newValue: Area) => {
          console.info(`Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
          this.sizeValue = JSON.stringify(newValue)
        })
      Text('new area is: \n' + this.sizeValue).margin({ right: 30, left: 30 })
    }
    .width('100%').height('100%').margin({ top: 30 })
  }
}

onAreaChange和onSizeChange的区别

因为size的变化,必定会因此areai变化,所以

  • onSizeChange调用的时候一定会触发onAreaChange
  • onAreaChage调用的时候不一定会触发onSizeChange
    结合PanGesture手势事件,实验代码如下:
dart 复制代码
// xxx.ets
@Entry
@Component
struct PanGestureExample {
  @State offsetX: number = 0
  @State offsetY: number = 0
  positionX: number = 0
  positionY: number = 0
  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All })
  @State mHeight:number = 200;
  build() {
    Column() {
      Column() {
        Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
      }
      .height(this.mHeight)
      .width(300)
      .padding(20)
      .border({ width: 3 })
      .margin(50)
      .onClick(()=>{
        console.info('Pan click')
        // this.mHeight +=5;
      })  .onAreaChange((oldValue: Area, newValue: Area) => {
        console.error(`PanGesture onAreaChange: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
      })  .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
        console.info(`PanGesture onSizeChange: on size change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
      })
      .translate({ x: this.offsetX, y: this.offsetY }) // 以组件左上角为坐标原点进行移动,此处也可以调用position({ x: this.offsetX, y: this.offsetY }) 方法
      // 左右拖动触发该手势事件
      .gesture(
        PanGesture(this.panOption)
          .onActionStart((event: GestureEvent) => {
            console.info('Pan start')
          })
          .onActionUpdate((event: GestureEvent) => {
            if (event) {
              this.offsetX = this.positionX + event.offsetX
              this.offsetY = this.positionY + event.offsetY
            }
          })
          .onActionEnd((event: GestureEvent) => {
            //记录拖动结束前停留的位置
            this.positionX = this.offsetX
            this.positionY = this.offsetY
            console.info('Pan end')
          })
      )
    }
  }
}

参考资料

HarmonyOS(45) 控件拖动或者拖拽PanGesture
组件尺寸变化事件
组件区域变化事件

相关推荐
在下历飞雨4 小时前
Kuikly基础之动画实战:让孤寡青蛙“活”过来
前端·ios·harmonyos
马剑威(威哥爱编程)4 小时前
【鸿蒙开发实战篇】HarmonyOS 6.0 蓝牙实现服务端和客户端通讯案例详解
华为·蓝牙·harmonyos
遇到困难睡大觉哈哈5 小时前
Harmony os——ArkTS 高性能编程实践 – 速查笔记
笔记·harmonyos·鸿蒙
平平不平凡6 小时前
Grid组件核心参数解析:控制器与布局选项详解
harmonyos
灰灰勇闯IT6 小时前
Flutter×VS Code:跨端开发的高效协作指南(2025最新配置)
笔记·flutter·harmonyos
Rene_ZHK6 小时前
Day1鸿蒙开发环境部署:从零开始的工程化配置指南
华为·harmonyos
遇到困难睡大觉哈哈6 小时前
Harmony os 网络防火墙实战:用 @ohos.net.netFirewall 给应用加一道“网闸”
网络·.net·harmonyos·鸿蒙
马剑威(威哥爱编程)6 小时前
【鸿蒙开发实战篇】如何实现高级图片滤镜
华为·harmonyos
马剑威(威哥爱编程)7 小时前
【鸿蒙开发实战篇】鸿蒙6.0图片编辑实战:PixelMap与Canvas的完美结合
华为·harmonyos
遇到困难睡大觉哈哈7 小时前
Harmony os Socket 编程实战:TCP / UDP / 多播 / TLS 一锅炖学习笔记
学习·tcp/ip·udp·harmonyos·鸿蒙