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

简介: 实现一个矩形块上下拖动,并且可以拖动边缘定位点改变矩形块高度。

简介

实现一个矩形块上下拖动,并且可以拖动边缘定位点改变矩形块高度。实现效果如下:

代码

@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来实现边缘的圆圈定位。
  • 实现矩形高度向上的方式是,增加高度的同时,往上偏移相同的距离
相关文章
|
4天前
|
开发者
鸿蒙开发:了解分割线
在实际的开发中,如果自带的分割线能够满足我们的需求,以自身的分割线属性为主,如果不满足,我们可以使用组件进行绘制。
61 16
鸿蒙开发:了解分割线
|
2天前
|
人工智能 程序员 iOS开发
一文彻底拿下HarmonyOS NEXT开发实战调试技巧
这是一篇关于HarmonyOS NEXT开发调试技巧的文章,作者是一名经验丰富的程序员Feri。内容涵盖三种调试方法:预览+日志方式(适合简单调试,需注意数据类型转换)、断点调试(详细介绍了设置步骤与功能键使用)以及hilog实战使用(日志打印限制为4096字节,推荐封装维护)。通过这些技巧,帮助开发者更高效地解决问题,提升编程能力。
56 14
一文彻底拿下HarmonyOS NEXT开发实战调试技巧
|
2天前
|
人工智能 安全 程序员
一文彻底搞清楚HarmonyOS NEXT的元服务
简介:本文详细介绍Harmony OS中的“元服务”,一种轻量级应用程序形态,支持免安装、秒开直达、多设备运行等特性,大幅提升服务获取效率。文中对比了元服务与传统App应用的区别,阐述其六大特征:秒开直达、服务相伴、用完即走、一体两面、原生智能、高效开发。同时,文章还提供了元服务的开发流程,包括开发前准备、开发中具体步骤、打包、测试及上架发布,帮助开发者快速掌握元服务的开发与应用。
62 13
一文彻底搞清楚HarmonyOS NEXT的元服务
|
1天前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
53 27
|
1天前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
51 31
|
2天前
|
开发者
鸿蒙开发:刷新库V2装饰器适配
如果你是新写的项目,建议直接上手V2装饰器,即便是已经存在的项目,对于新的模块,也是尽量以V2为主。
鸿蒙开发:刷新库V2装饰器适配
|
5天前
|
容器
鸿蒙开发:填充剩余空间
关于占满剩余的空间,如果权重能够解决,还是以权重为主,因为Blank的使用必须父组件的宽高有值,否则就会不生效,当然了,在实际的开发中,还是具体问题具体分析,使用恰当的方式解决为主。
鸿蒙开发:填充剩余空间
|
2天前
|
人工智能 JavaScript 安全
一文彻底搞清楚HarmonyOS NEXT中的this
程序员Feri是一位拥有12年+经验的开发者,擅长Java、嵌入式、鸿蒙、人工智能等领域。本文深入探讨了ArkTS中this关键字的重要性及其核心规则。通过分析组件方法、异步回调、@Builder上下文隔离和装饰器方法中的this指向,揭示其运行机制与常见陷阱。同时提供了高阶技巧如内存管理、函数式组件优化及性能对比,并总结调试指南与最佳实践,助你构建高性能HarmonyOS NEXT应用。
52 8
|
1天前
鸿蒙开发:正则中的match和matchAll
在实际的开发中,match和matchAll是两个非常常见的的正则表达式方法;match方法适用于简单的匹配操作,而matchAll方法则适用于需要获取所有匹配结果及其捕获组的场景。
鸿蒙开发:正则中的match和matchAll
|
6天前
|
存储 编解码 资源调度
鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
本文分享鸿蒙相机开发经验,从环境准备到核心逻辑实现,涵盖权限声明、模块导入、Surface关联与分辨率匹配,再到录制控制及设备适配法则。通过实战案例解析,如旋转补偿、动态帧率调节和编解码优化,帮助开发者掌握功能实现、设备适配与体验设计三大要点,减少开发坑点。适合鸿蒙新手及希望深化硬件交互能力的工程师参考收藏。
30 2