【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来实现边缘的圆圈定位。
  • 实现矩形高度向上的方式是,增加高度的同时,往上偏移相同的距离
相关文章
|
1天前
【HarmonyOS Next开发】:ListItemGroup使用
通过使用ListItemGroup和AlphabetIndexer两种类型组件,实现带标题分类和右侧导航栏的页面
80 61
|
1天前
|
API
【HarmonyOS Next开发】Tabs使用封装
在写Tabs时,会使用很多个TabContent来实现不同页面的展示内容,但是如果TabContent数量很多时,会导致Tabs代码量大而且很臃肿,因此想着尝试去封装Tabs的使用,可以让界面整洁和对内容界面的解耦。 主要依托于wrapBuilder:封装全局@Builder的方法使用。需要注意从API 11 才开始支持使用
16 6
|
1天前
|
API 容器
【HarmonyOS Next开发】Navigation使用
Navigation是路由容器组件,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。适用于模块内和跨模块的路由切换。 在页面跳转时,应该使用页面路由router,在页面内的页面跳转时,建议使用Navigation达到更好的转场动效场景。
18 8
|
1天前
|
开发者
【HarmonyOS Next开发】用户文件访问
文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为,需要提前获取用户授权,或由用户操作完成。
19 10
|
1天前
|
存储 JSON 测试技术
【HarmonyOS Next开发】云开发-云数据库(二)
实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。
19 9
|
1天前
|
存储 IDE JavaScript
【HarmonyOS Next开发】端云一体化初始化项目
端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务,可以使开发者专注于应用的业务逻辑开发,无需关注基础设施,例如:服务器、操作系统等问题。
15 6
|
2天前
|
人工智能 文字识别 算法
|
2天前
|
安全 Java 开发者
|
2天前
|
存储 开发者 容器

热门文章

最新文章