鸿蒙应用示例:仿钉钉日历新建日程

【开发环境】

开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.814

工程API版本:12

【组件初始化】

Page02结构体定义了几个状态变量:offsetX, offsetY, positionX, positionY,这些变量用于跟踪用户操作引起的UI位置变化。containerHeight和originalHeight则用来控制UI容器的高度,同时containerHeightChanged方法确保容器的高度不会低于设定的最小值。

【用户界面构建】

build()方法是创建UI的核心逻辑。它首先创建了一个Column布局,用于垂直排列子元素。内部的RelativeContainer则允许更精细的位置控制,通过绝对或相对位置来放置子元素。

【动态UI元素】

在RelativeContainer中,我们添加了一个带有文字的矩形和两个圆点。这两个圆点不仅作为视觉元素,还绑定了拖动手势(PanGesture),这使得用户可以通过拖动操作改变容器的高度,从而模拟日程项的增加或减少过程。

【手势处理】

我们使用了两种不同的拖动手势:一种用于调整容器的高度,另一种则用于整体移动容器的位置。这些手势操作更新了相应的状态变量,并最终反映在UI布局上。

【完整代码】

javascript 复制代码
@Entry
@Component
struct Page02 {
  @State offsetX: number = 0;
  @State offsetY: number = 0;
  @State positionX: number = 0;
  @State positionY: number = 0;
  @State @Watch('containerHeightChanged') containerHeight: number = 50;
  @State originalHeight: number = 50;

  containerHeightChanged() {
    if (this.containerHeight < 50) {
      this.containerHeight = 50
    }
  }

  build() {
    Column() {
      RelativeContainer() {
        Rect()
          .fill("#2fd164")
          .borderColor("#39bd66")
          .borderWidth(1)
          .borderRadius(5)
          .clip(true)
          .width("100%")
          .height("100%")

        Text("再次点击新建日程")
          .fontColor(Color.White)
          .margin({ top: 30, left: 130 })
          .fontSize(15)
          .alignRules({
            center: { anchor: "__container__", align: VerticalAlign.Top },
            middle: { anchor: "__container__", align: HorizontalAlign.Start }
          })

        Stack() {
          Circle({ height: 5, width: 5 })
            .fill(Color.White)
            .stroke(Color.White)
            .strokeWidth(2)
        }
        .hitTestBehavior(HitTestMode.Block)
        .padding(20)
        .margin({ left: 60 })
        .alignRules({
          center: { anchor: "__container__", align: VerticalAlign.Top },
          middle: { anchor: "__container__", align: HorizontalAlign.Start }
        })
        .gesture(PanGesture({
          fingers: 1,
          direction: PanDirection.Vertical,
          distance: 1
        }).onActionUpdate((event: GestureEvent) => {
          if (event) {
            this.offsetY = this.positionY + event.offsetY;
            this.containerHeight = this.originalHeight - event.offsetY;
          }
        }).onActionEnd(() => {
          this.positionX = this.offsetX;
          this.positionY = this.offsetY;
          this.originalHeight = this.containerHeight;
        })
        )

        Stack() {
          Circle({ height: 5, width: 5 })
            .fill(Color.White)
            .stroke(Color.White)
            .strokeWidth(2)
        }
        .hitTestBehavior(HitTestMode.Block)
        .padding(20)
        .margin({ right: 60 })
        .alignRules({
          center: { anchor: "__container__", align: VerticalAlign.Bottom },
          middle: { anchor: "__container__", align: HorizontalAlign.End }
        })
        .gesture(PanGesture({
          fingers: 1,
          direction: PanDirection.Vertical,
          distance: 2
        }).onActionUpdate((event: GestureEvent) => {
          this.containerHeight = this.originalHeight + event.offsetY;
        }).onActionEnd(() => {
          this.originalHeight = this.containerHeight;
        })
        )
      }
      .height(this.containerHeight)
      .width("80%")
      .translate({ x: this.offsetX, y: this.offsetY })
      .gesture(PanGesture({
        fingers: 1,
        direction: PanDirection.Vertical,
        distance: 1
      }).onActionUpdate((event: GestureEvent) => {
        if (event) {
          this.offsetX = this.positionX + event.offsetX;
          this.offsetY = this.positionY + event.offsetY;
        }
      }).onActionEnd(() => {
        this.positionX = this.offsetX;
        this.positionY = this.offsetY;
      })
      )
    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
lilian23316 小时前
HarmonyOS 7 新特性(二十五)|智慧手势:意图识别与误触治理
华为·harmonyos
贾伟康18 小时前
【时光清单|14】HarmonyOS ArkTS 主导航实战:统一页面入口、返回路径和参数校验
harmonyos·arkts·arkui·navigation·路由管理
骐骥121 小时前
学习:javaScriptProxy和registerJavaScriptProxy有什么区别,能注册多少个对象
学习·鸿蒙
贾伟康1 天前
【时光清单|05】HarmonyOS ArkTS 倒计时卡片实战:适配 2x2、2x4 与 4x4 多尺寸
harmonyos·arkts·arkui·服务卡片·formextensionability
小雨青年1 天前
【HarmonyOS 7 悬浮页签深度实战】07 折叠屏、平板与宽窗口的布局适配
华为·harmonyos
熊猫钓鱼>_>1 天前
鸿蒙AI Agent新范式:从“对话式辅助”到“工程化代理”的Harness架构实战解析
人工智能·笔记·学习·华为·架构·harmonyos
大锅盖11 天前
HarmonyOS ArkUI 非遗纹样素材平台设计复盘:朱砂宣纸与鎏金黛蓝的文化守护
华为·harmonyos
2501_919749031 天前
华为鸿蒙管理学习生活与工作APP—小羊管理
学习·华为·生活·harmonyos·鸿蒙
贾伟康1 天前
【时光清单|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
harmonyos·arkts·agc·appgallery·发布复查
lilian2331 天前
HarmonyOS 7 新特性(二十三)|hiprofiler + hidumper:跨堆内存分析
华为·harmonyos