【HarmonyOS】实现矩形上下拖动、动态拖拽修改高度

简介

实现一个矩形块上下拖动,并且可以拖动边缘定位点改变矩形块高度。实现效果如下:
在这里插入图片描述

代码

@Entry
@Component
struct Rec_Page {
  @State penOffsetY: number = 0;
  @State offsetX: number = 0
  @State offsetY: number = 0
  @State positionX: number = 0
  @State positionY: number = 0
  @State rectHeight: number = 50;
  @State originHeight: number = 50;

  build() {
    Column() {
      Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
        .margin({ bottom: 20 })
      Text('penOffsetY:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.penOffsetY)
        .margin({ bottom: 20 })
      Text(`rectHeight:${this.rectHeight}`)
        .margin({ bottom: 20 })
      RelativeContainer() {
        Shape() {
          Rect()
            .width("100%")
            .height("100%")
            .fill("#dbe6fc")
            .radius(5)
        }
        .borderColor("#3152ab")
        .borderWidth(1)
        .borderRadius(5)
        .width("100%")
        .height("100%")

        Text("添加日程")
          .fontColor("#375bc1")
          .id("AddText")
          .alignRules({
            "center": { "anchor": "__container__", "align": VerticalAlign.Center },
            "middle": { "anchor": "__container__", "align": HorizontalAlign.Center }
          })
        Circle({ height: 10, width: 10 })
          .fill(Color.White)
          .id("TopCircle")
          .stroke("#1a52e3")
          .strokeWidth(2)
          .margin({ right: 150 })
          .alignRules({
            "center": { "anchor": "__container__", "align": VerticalAlign.Top },
            "middle": { "anchor": "__container__", "align": HorizontalAlign.End }
          })
          .gesture(
            PanGesture({
              fingers: 1,
              direction: PanDirection.Vertical,
              distance: 1
            }).onActionUpdate((event: GestureEvent) => {
              if (event) {
                this.offsetY = this.positionY + event.offsetY
                this.rectHeight = this.originHeight - event.offsetY
              }
            })
              .onActionEnd((event: GestureEvent) => {
                this.positionX = this.offsetX
                this.positionY = this.offsetY
                this.originHeight = this.rectHeight;
                console.info('Pan end')
              })
          )
        Circle({ height: 10, width: 10 })
          .fill(Color.White)
          .id("BottomCircle")
          .stroke("#1a52e3")
          .strokeWidth(2)
          .margin({ left: 150 })
          .alignRules({
            "center": { "anchor": "__container__", "align": VerticalAlign.Bottom },
            "middle": { "anchor": "__container__", "align": HorizontalAlign.Start }
          })
          .gesture(
            PanGesture({
              fingers: 1,
              direction: PanDirection.Vertical,
              distance: 2
            }).onActionUpdate((event: GestureEvent) => {
              if (event && this.rectHeight > 15) {
                this.rectHeight = this.originHeight + event.offsetY
              }
            })
              .onActionEnd((event: GestureEvent) => {
                this.originHeight = this.rectHeight;
                console.info('Pan end')
              })

          )

      }
      .margin({ top: 20 })
      .height(this.rectHeight)
      .width("80%")
      .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
      .gesture(
        PanGesture({
          fingers: 1,
          direction: PanDirection.Vertical,
          distance: 1
        })
          .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')
          })
      )
    }
    .height('100%')
    .width('100%')
  }
}

代码解析

  • 通过PanGesture手势类和translate来实现组件的实时偏移。
  • 通过RelativeContainer来实现边缘的圆圈定位。
  • 实现矩形高度向上的方式是,增加高度的同时,往上偏移相同的距离
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baobao熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值