HarmonyOS 鸿蒙Next 列表交换时为什么有的时候有动画有的时候没有动画感觉像是重新加载列表似的

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

HarmonyOS 鸿蒙Next 列表交换时为什么有的时候有动画有的时候没有动画感觉像是重新加载列表似的
列表交换时.为什么有的时候有动画 有的时候没有动画感觉像是重新加载列表似的

@Component
export struct ListAccount {
  @Consume kindTranT: Account[]
  @State dragItem: Account | undefined = undefined
  @State scaleItem: Account | undefined = undefined
  @State neighborItem: Account | undefined = undefined
  @State neighborScale: number = -1
  private dragRefOffset: number = 0
  @State first: boolean = true
  @State @Watch('aaa') offsetY: number = 0

  aaa() {
    console.log('BillLog_导出文本账单失败:1', JSON.stringify(this.offsetY))
  }

  private ITEM_INTV: number = 66
  delete: (item: Account) => void = (item: Account) => {

  }
  open: (item: Account) => void = (item: Account) => {

  }
  @StorageLink('isOpenBackGroundBlur') isOpenBackGroundBlur: boolean = false; // 背景模糊
  @StorageLink('isShowBgImage') isShowBgImage: boolean = false; //显示背景图片

  scaleSelect(item: Account): number {
    if (this.scaleItem?.cardName == item?.cardName) {
      return 1.05
    } else if (this.neighborItem?.cardName == item?.cardName) {
      return this.neighborScale
    } else {
      return 1
    }
  }

  itemMove(index: number, newIndex: number): void {
    if (newIndex === this.kindTranT.length || newIndex < 0) {
      return
    }
    let tmp = this.kindTranT.splice(index, 1)
    this.kindTranT.splice(newIndex, 0, tmp[0])
    util_Preference.putPreferenceValue('账户', this.kindTranT)
  }

  build() {

    List({ space: 10 }) {
      ForEach(this.kindTranT, (item: Account) => {
        ListItem() {
          Row() {
            Row() {
              Image(item.cardImage.replace('.png', '.svg'))
                .height(24)
                .width(24)
                .fillColor($r("app.color.font_color"))

              Text(item.cardName)
                .TextStyle()
                .fontColor($r('app.color.font_color'))
                .margin({ left: 16 })
            }
            .layoutWeight(1)
            .onClick(() => {
              this.open(item)
            })

            Blank()
            SymbolGlyph($r('sys.symbol.trash'))
              .fontColor([$r("app.color.font_warn")])
              .fontSize($r('app.float.font_size24'))
              .onClick(() => {
                if (this.kindTranT.length === 1) {
                  DialogHelper.showToastTip({
                    orientation: Orientation.HORIZONTAL,
                    message: "分类列表至少一个分类!",
                    imageRes: $r('app.media.exclamationmark_triangle'),
                    duration: 600,
                  })
                } else {
                  this.delete(item)
                }

              })
              .opacity(0.6)
          }
          .padding({ left: 16, right: 16 })
          .justifyContent(FlexAlign.SpaceBetween)
          .width('100%')
          .height(56)
        }

        .clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.9 })
        .borderRadius(24)
        .backgroundColor(this.isShowBgImage && this.isOpenBackGroundBlur
          ? $r('app.color.menu_backGround') : $r('app.color.backGround_second'))


        .scale({ x: this.scaleSelect(item), y: this.scaleSelect(item) })
        .zIndex(this.dragItem?.cardName == item?.cardName ? 1 : 0)
        .translate(this.dragItem?.cardName == item?.cardName ? { y: this.offsetY } : { y: 0 })
        .gesture(
          // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件
          GestureGroup(GestureMode.Sequence,
            LongPressGesture({ repeat: true })
              .onAction((event?: GestureEvent) => {
                if (this.first) {
                  util_Some.vibratorC()
                  this.first = false
                }
                animateTo({ curve: Curve.Friction, duration: 300 }, () => {
                  this.scaleItem = item
                })
              })
              .onActionEnd(() => {
                animateTo({ curve: Curve.Friction, duration: 300 }, () => {
                  this.scaleItem = undefined
                })
              }),
            PanGesture({ fingers: 1, direction: null, distance: 0 })
              .onActionStart(() => {
                this.dragItem = item
                this.dragRefOffset = 0
              })
              .onActionUpdate((event: GestureEvent) => {
                this.offsetY = event.offsetY - this.dragRefOffset
                this.neighborItem = undefined
                let index = this.kindTranT.indexOf(item)
                let curveValue = Curves.initCurve(Curve.Sharp)
                let value: number = 0
                //根据位移计算相邻项的缩放
                if (this.offsetY < 0) {
                  value = curveValue.interpolate(-this.offsetY / this.ITEM_INTV)
                  this.neighborItem = this.kindTranT[index - 1]
                  this.neighborScale = 1 - value / 20;
                  console.log('neighborScale:' + this.neighborScale.toString())
                } else if (this.offsetY > 0) {
                  value = curveValue.interpolate(this.offsetY / this.ITEM_INTV)
                  this.neighborItem = this.kindTranT[index + 1]
                  this.neighborScale = 1 - value / 20;
                }
                //根据位移交换排序
                if (this.offsetY > this.ITEM_INTV / 2) {
                  util_Some.vibratorC()
                  animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
                    this.offsetY -= this.ITEM_INTV
                    this.dragRefOffset += this.ITEM_INTV
                    this.itemMove(index, index + 1)
                  })
                } else if (this.offsetY < -this.ITEM_INTV / 2) {
                  util_Some.vibratorC()
                  animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
                    this.offsetY += this.ITEM_INTV
                    this.dragRefOffset -= this.ITEM_INTV
                    this.itemMove(index, index - 1)
                  })
                }
              })
              .onActionEnd((event: GestureEvent) => {
                util_Some.vibratorC()
                this.first = true
                animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
                  this.dragItem = undefined
                  this.neighborItem = undefined
                })
                animateTo({
                  curve: curves.interpolatingSpring(14, 1, 170, 17), delay: 150
                }, () => {
                  this.scaleItem = undefined
                })
              })
          )
            .onCancel(() => {
              animateTo({ curve: curves.interpolatingSpring(0, 1, 400, 38) }, () => {
                this.dragItem = undefined
                this.neighborItem = undefined
              })
              animateTo({
                curve: curves.interpolatingSpring(14, 1, 170, 17), delay: 150
              }, () => {
                this.scaleItem = undefined
              })
            })
        )
      },
        (item: Account) => item.cardName.toString() + new Date
      )
    }
    .width('100%')
    .height('100%')
    .scrollBar(BarState.Off)
    .chainAnimation(true)
  }
}

感觉代码没有问题啊


更多关于HarmonyOS 鸿蒙Next 列表交换时为什么有的时候有动画有的时候没有动画感觉像是重新加载列表似的的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

感觉交换手势确实写得有点乱,可以参考一下官方提供的列表交换demo

更多关于HarmonyOS 鸿蒙Next 列表交换时为什么有的时候有动画有的时候没有动画感觉像是重新加载列表似的的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next列表交换时动画效果的存在与否,通常与列表的刷新机制和数据绑定方式有关。

在鸿蒙系统中,列表的动画效果往往依赖于数据变化时触发的UI更新机制。如果数据更新较为频繁或方式不当,可能会导致动画效果无法正常呈现,而呈现出重新加载的视觉效果。

具体来说,当列表数据发生变化时,如果系统能够检测到这种变化并相应地触发动画过渡效果,那么用户就会看到平滑的动画。反之,如果数据变化过于剧烈或系统未能正确识别变化类型,就可能跳过动画步骤,直接呈现新的列表状态,从而产生“重新加载”的错觉。

此外,列表组件本身的实现细节和性能优化策略也可能影响动画的呈现。例如,为了提高渲染效率,某些情况下可能会牺牲动画效果以确保流畅的用户体验。

如果你遇到这个问题,可以检查以下几点:

  • 确保数据更新是逐步进行的,避免一次性大量更新。
  • 查看列表组件的文档,了解其对数据变化的响应机制。
  • 检查是否有性能优化策略影响了动画的呈现。

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

回到顶部