HarmonyOS 鸿蒙Next想要实现红包雨效果但是view在移动过程中点不到

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next想要实现红包雨效果但是view在移动过程中点不到
按照工具:241023171601042的写法,在红包增加click事件,但是没有响应。

2 回复

可以参考demo:

class ControllerClass {
  add = () => {
  }
}

@Entry
@Component
struct RedEnvelopePage {
  @State controllerClassIns: ControllerClass = new ControllerClass()

  build() {
    Column() {
      RedEnvelope({ dmController: this.controllerClassIns })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('发送红包').onClick(() => {
          this.controllerClassIns.add()
        })
      }.padding(20)
    }
    .border({ width: 1 })
    .width('100%')
    .margin({ top: '25%' })
    .height('50%')
  }
}

@Observed
class dmItemClass {
  id: number = 0
  positionY = -150
  angle = Math.random() * 360
}

@Component
struct RedEnvelope {
  @Link dmController: ControllerClass
  @State dmItemList: dmItemClass[] = []
  @State dmHeight: number = 0

  aboutToAppear(): void {
    this.dmController.add = () => {
      this.add()
    }
  }

  build() {
    Column() {
      ForEach(this.dmItemList, (dmItem: dmItemClass, index) => {
        Column() {
          RedEnvelopeItem({ dmHeight: this.dmHeight, item: dmItem })
        }
        .height('100%')
        .position({ x: 0, y: 0 })
      }, (item: dmItemClass, index) => item.id.toString())
    }
    .onSizeChange((old, newVal) => {
      this.dmHeight = newVal.height as number
    })
    .clip(true)
    .height('100%')
    .width('100%')
  }

  add() {
    let ins = new dmItemClass()
    if (this.dmItemList.length > 0) {
      ins.id = this.dmItemList[this.dmItemList.length - 1].id + 1
    }
    this.dmItemList.push(ins)
  }
}

@Reusable
@Component
struct RedEnvelopeItem {
  @Prop dmHeight: number
  positionX: number = Math.random() * 330
  @ObjectLink item: dmItemClass
  inervalNum = -1

  aboutToAppear(): void {
    this.inervalNum = setInterval(() => {
      this.item.positionY += 2
    }, 20)
  }

  build() {
    if (this.item.positionY < (this.dmHeight + 100)) {
      Column() {}
      .onClick(() => {
        console.info("点击红包")
      })
      .width(60)
      .height(100)
      .backgroundColor('red')
      .border({ width: 2 })
      .rotate({ angle: this.item.angle })
      .onClick(() => {
        console.info("进入点击红包")
      })
      .onDisAppear(() => {
        clearInterval(this.inervalNum)
      })
      .position({
        x: this.positionX ? this.positionX : 0,
        y: this.item.positionY
      })
    }
  }
}

更多关于HarmonyOS 鸿蒙Next想要实现红包雨效果但是view在移动过程中点不到的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next实现红包雨效果时view在移动过程中点不到的问题,这通常是由于视图(view)的触摸事件处理不当或者视图层级管理问题导致的。

在鸿蒙系统中,当视图在动画过程中移动时,其触摸事件的接收可能会受到影响,特别是如果视图在动画过程中改变了其所在的父容器或者其可见性、透明度等属性。

一种可能的解决方案是确保在动画过程中,视图的onTouchEvent方法能够正确接收到触摸事件。这可能需要你检查以下几点:

  1. 视图层级:确保视图在动画过程中始终位于可触摸的层级上,没有被其他视图遮挡。
  2. 触摸事件分发:检查父容器的onInterceptTouchEvent方法,确保它没有拦截应该传递给子视图的触摸事件。
  3. 动画属性:如果动画改变了视图的透明度或大小,确保这些变化不会影响到触摸事件的接收。

如果以上检查都没有问题,但问题依旧存在,那么可能是鸿蒙系统在某些特定情况下的bug或者限制。此时,你可以考虑使用其他方式实现红包雨效果,比如通过自定义动画和事件处理逻辑来绕过这个问题。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部