HarmonyOS 鸿蒙Next 列表条目拖动

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

HarmonyOS 鸿蒙Next 列表条目拖动

根据文档加上属性和方法还是无法拖动  
下面是List的设置  

```typescript
List() {
  ForEach(this.myChannelData, (item: ChannelListData, index) => {
    ListItem() {
      this.itemLayout(item, 'my')
    }
    .onClick(() => {
      if (this.isEditable && item.type != 'default') {
        this.myChannelData.splice(index, 1)
        this.allChannelData.push(item)
      }
    })
  })
}
.width('100%')
.padding({ left: 11, right: 11 })
.lanes(4)
.scrollBar(BarState.Off)
.draggable(true) //拖拽效果
.onItemDragStart((event: ItemDragInfo, itemIndex: number) => {
  //开始拖拽列表元素时触发。
})
.onItemDragEnter((event: ItemDragInfo) => {
  //拖拽进入列表元素范围内时触发。
})
.onItemDragMove((event: ItemDragInfo, itemIndex: number, insertIndex: number) => {
  //拖拽在列表元素范围内移动时触发。
})
.onItemDragLeave((event: ItemDragInfo, itemIndex: number) => {
  //拖拽离开列表元素时触发。
})
.onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => {
  //绑定该事件的列表元素可作为拖拽释放目标,当在列表元素内停止拖拽时触发。
})

更多关于HarmonyOS 鸿蒙Next 列表条目拖动的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

伙伴您好,标签自由拖动可以参考以下demo: @Entry @Component struct Index { @State numbers: String[] = [“娱乐”, “关注”, “热榜”, “航天”, “动漫”, “宠物”, “保险”, “NBA”, “汽车”, “财经”, “体育”, “女性”, “搞笑”, “军事”, “有料”, “北京”, “深度”, “5G”] scroller: Scroller = new Scroller() @State text: string = ‘drag’ @State isShowDelete: boolean = false @State isEdit: boolean = false @State rotateZ: number = 0;

private stopJump() { animateTo({ delay: 0, tempo: 5, duration: 0, curve: Curve.Smooth, playMode: PlayMode.Normal, iterations: 1 }, () => { this.rotateZ = 0; }) }

//抖动的动画 private jumpWithSpeed(speed: number) { if (this.isEdit) { this.rotateZ = -1; animateTo({ delay: 0, //延时播放 tempo: speed, //动画的播放速度,值越大动画播放越快 duration: 2000, //动画持续的时间 curve: Curve.Smooth, //动画曲线 playMode: PlayMode.Normal, //动画播放模式 iterations: -1 }, () => { this.rotateZ = 1; }) } else { this.stopJump() } }

//拖拽过程中展示的样式 @Builder pixelMapBuilder() { Column() { Text(this.text) .fontSize(16) .backgroundColor(0xF9CF93) .width(80) .height(40) .textAlign(TextAlign.Center) .borderRadius(20) .borderWidth(2) .borderColor(Color.Orange) }

//改变数组中元素位置 changeIndex(index1: number, index2: number) { this.numbers.splice(index2, 0, this.numbers.splice(index1, 1)[0])

}

build() { Column({ space: 5 }) { Row({ space: 30 }) { Text(“我的频道”) .fontSize(20) Text(this.isEdit ? “长按拖动调整顺序” : “点击编辑按钮进入编辑”) .fontColor(Color.Gray) Button() { Text(this.isEdit ? “完成” : “编辑”) .fontColor(this.isEdit ? Color.Black : 0xF19510 ) }.width(80) .height(30) .backgroundColor(Color.White) .onClick(() => { this.isEdit = !this.isEdit this.jumpWithSpeed(5) }) }.padding({ left: 15 })

  Grid(this.scroller) {
    ForEach(this.numbers, (day: string, index: number) => {
      GridItem() {
        Stack({ alignContent: Alignment.TopEnd }) {
          Text(day)
            .borderRadius(20)
            .borderWidth(2)
            .borderColor(Color.Orange)
            .fontSize(16)
            .backgroundColor(0xF9CF93)
            .width(80)
            .height(40)
            .textAlign(TextAlign.Center)
            .onTouch((event: TouchEvent) => {
              if (event.type === TouchType.Down) {
                this.text = day

              }
            })
          if (this.isEdit) {
            Image($r('app.media.close'))
              .width(20)
              .height(20)
              .onClick(() => {
                animateTo({ duration: 300 }, () => {
                  this.numbers.splice(index, 1)
                })
                this.stopJump()

                this.jumpWithSpeed(5)
              })
          }
        }
        .rotate({ z: this.rotateZ,
          angle: 0.4,
          centerX: 0.5,
          centerY: 0.5
        })
      }
      .transition({ type: TransitionType.All, translate: { x: 100 }, scale: { x: 1, y: 1 } })
      .padding({ top: 15 })
    })
  }
  .columnsTemplate('1fr 1fr 1fr')
  .columnsGap(10)
  .rowsGap(10)
  .onScrollIndex((first: number) => {
    console.info(first.toString())
  })
  .margin({ top: 5 })
  .width('100%')
  .backgroundColor(0xFAEEE0)
  .height('100%')
  .supportAnimation(true) //是否支持动画
  //设置Grid是否进入编辑模式,进入编辑模式可以拖拽Grid组件内部GridItem
  .editMode(this.isEdit)
  //第一次拖拽此事件绑定的组件时,触发回调
  .onItemDragStart((event: ItemDragInfo, itemIndex: number) => {
    //设置拖拽过程中显示的图片
    return this.pixelMapBuilder()
  })
  //绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调
  //itemIndex为拖拽起始位置,insertIndex为拖拽插入位置
  .onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => {
    //不支持拖拽到已有内容以外的位置
    if (insertIndex < this.numbers.length) {
      this.changeIndex(itemIndex, insertIndex)
      this.stopJump()
      this.jumpWithSpeed(5)
    }
  })
}.width('100%')
.margin({ top: 5 })
.alignItems(HorizontalAlign.End)

} }

更多关于HarmonyOS 鸿蒙Next 列表条目拖动的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,实现列表条目(List Item)的拖动功能通常涉及到对列表组件的自定义处理以及对拖动事件的监听和响应。以下是一个简要的实现思路:

鸿蒙系统提供了丰富的UI组件库,其中列表组件(如ListContainer)支持通过自定义Adapter来管理数据项。要实现列表条目的拖动,你需要:

  1. 自定义Adapter:确保你的Adapter能够处理数据项的插入、删除和移动操作。

  2. 启用拖动模式:在列表组件上设置相应的属性或方法以启用拖动模式。这通常涉及到对组件的触摸事件进行监听,并在触摸事件中实现拖动逻辑。

  3. 处理拖动事件:在拖动过程中,你需要实时更新UI以反映当前拖动的位置,并在拖动结束时根据最终位置更新数据项的顺序。

  4. 动画效果:为了提升用户体验,可以在拖动过程中添加动画效果,如拖动条目的阴影、位置变化时的平滑过渡等。

请注意,具体的实现细节可能因鸿蒙系统的版本和API而有所不同。如果你正在使用某个特定的鸿蒙SDK版本,建议查阅该版本的官方文档以获取更详细的信息和示例代码。

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

回到顶部