HarmonyOS 鸿蒙Next组件移动

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

HarmonyOS 鸿蒙Next组件移动

组件移动可以通过ontouch事件实现吗,具体的逻辑是怎样的,目前使用拖拽事件,它开始的响应时间太长了

5 回复
import display from '@ohos.display';
import { promptAction } from '@kit.ArkUI';
import { ResManager } from '@ohos/source';

let displayClass: display.Display | null = null

try {
  displayClass = display.getDefaultDisplaySync()
} catch (exception) {
  console.error("wy" + JSON.stringify(exception))
}

/**
 * 可拖动的Imageview, 默认位置x方向上的值为0时可以不用传入值,否则需要传入positionX的值
 * */
@Component
export struct FloatImage {
  //初始位置
  @State offsetX: number = 0
  @State offsetY: number = 0
  //拖动偏移量
  @State positionX: number = 0
  @State positionY: number = 0
  screenWidth: number | undefined = displayClass?.width
  density: number | undefined = displayClass?.densityPixels
  @State imageWidth: number  = 50
  @State imageHeight: number  = 50
  @State imageResource: Resource | string = ResManager.getLauncherIcon()

  build() {
    Stack() {
      Image(this.imageResource)
        .width(this.imageWidth)
        .height(this.imageHeight)
        .gesture(
          PanGesture()
            .onActionStart((event: GestureEvent | undefined) => {
              if (event) {

              }
            })
            .onActionUpdate((event: GestureEvent | undefined) => {
              if (event) {
                this.offsetX = this.positionX + event.offsetX
                this.offsetY = this.positionY + event.offsetY
              }
            })
            .onActionEnd((event: GestureEvent | undefined) => {
              if (event) {
                if (this.density != undefined
                  && this.screenWidth != undefined
                  && this.offsetX > this.screenWidth / (2 * this.density)) {
                  this.positionX = this.screenWidth / this.density - this.imageWidth
                } else {
                  this.positionX = 0
                }

                this.positionY = this.offsetY

                //拖动结束后自动靠边,拖动距离小于屏幕一半时靠左,大于一半时靠右
                animateTo({
                  duration: 500,
                  delay: 50,
                }, () => {
                  //注:由于动画和偏移量计算都是vp值,需要把屏幕宽度进行转换成vp
                  if (this.density != undefined
                    && this.screenWidth != undefined
                    && this.offsetX > this.screenWidth / (2 * this.density)) {
                    this.offsetX = this.screenWidth / this.density - this.imageWidth
                  } else {
                    this.offsetX = 0
                  }

                })
              }
            })
        )
        .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
    }
  }
}

可以用手势事件实现,参考我们项目的可拖动图片组件

请问手势的话可以跨组件吗

还想再请假一下是否可以实现类似拖拽,移动的时候原来位置的组件不变

手势是通用属性,理论上都可以

针对HarmonyOS鸿蒙Next组件移动的问题,这通常涉及到UI组件的动态布局调整。在鸿蒙系统中,可以通过多种方式实现组件的移动,包括但不限于:

  1. 监听滑动事件:通过监听滑动事件(如onScroll),在回调中动态调整组件的位置属性,如top、left等,以实现组件的移动效果。
  2. 使用动画API:鸿蒙系统提供了丰富的动画API,可以创建平滑的位移效果。开发者可以利用这些API来设置组件的移动动画,从而实现更生动的组件移动效果。
  3. 调整组件布局:在组件布局上,可以通过修改组件的宽高、边距等属性来调整其位置。特别是在使用Grid、Row、Column等布局容器时,合理设置这些属性可以有效控制组件的移动。

此外,对于列表滑动时组件位移的问题,可能是由于Grid高度变化导致Item高度变化,进而渲染效果出现跳动。此时,可以尝试在Grid组件上不设置高度,而是加上maxCount属性,以实现Grid高度自适应的效果,从而避免item渲染跳动。

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

回到顶部