OpenHarmony开发者论坛

标题: 如何实现如下场景:对列表的列表项进行拖动时,其他列表项自动补位和动态排列的效果。 [打印本页]

作者: 北向实践与赋能    时间: 2024-1-4 11:27
标题: 如何实现如下场景:对列表的列表项进行拖动时,其他列表项自动补位和动态排列的效果。
[md]如何实现如下场景:对列表的列表项进行拖动时,其他列表项自动补位和动态排列的效果。
[/md]
作者: 北向实践与赋能    时间: 2024-1-4 11:28
标题: 如何实现如下场景:对列表的列表项进行拖动时,其他列表项自动补位和动态排列的效果。
[md]**关键字**
列表,List,Grid,拖拽,排序

**解决方案**
1.为列表或宫格项(item)添加拖拽能力,使能 draggable,并注册onDragStart;
2.在 onDragStart 回调中将所拖条目设置visibility为 HIDDEN 状态;
2.在列表或宫格项(item)上注册 onDragMove 监听拖起的移动事件;
3.拖动过程中,通过 onDragMove 的 event 参数获取到拖拽跟手点坐标;
4.计算跟手点坐标与item中线的距离关系,当重合时,启动挤位动效;
5.Item布局信息可通过 componentUtils API获取到;
6.挤位动效通过animateTo来改变datasource里的index,触发list的排序动效;
7.落位动效可通过自定义动效完成;

以下是部分关键代码示意:

```ts
// 起拖时记录拖拽item
  .onDragStart((event?: DragEvent, extraParams?: string) => {
    this.dragIndex = Number(item.data)
    this.dragItem = item
  })
  // 进入新的item时执行挤位效果
  .onDragEnter((event?: DragEvent, extraParams?: string) => {
    if (Number(item.data) != this.dragIndex) {
      let current = this.dataSource.findIndex((element) => element.data === this.dragItem.data)
      let index = this.dataSource.findIndex((element) => element.data === item.data)
      animateTo({
        curve: curves.interpolatingSpring(0, 1, 400, 38)
      }, () => {
        this.dataSource.splice(current, 1)
        this.dataSource.splice(index, 0, this.dragItem)
      })
    }
  })
   // 释放时自定义落位动效,在释放位置开始对dragItem执行动效
  .onDrop((dragEvent: DragEvent) => {
    dragEvent.useCustomDropAnimation = true;
    // 获取到落位位置
    let downLocation = getInspectorByKey(item.data)
    let currentLocation = dragEvent.getPreviewRect()
    this.dragItem.scale = 1.05
    animateTo({
      curve: curves.interpolatingSpring(14, 1, 170, 17)
    }, () => {
      this.dragItem.scale = 1
    })
  }
```
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5