概述
核心功能
- 列表初始化:創建並填充列表數據。
- 拖拽交互:實現列表項的拖拽功能,包括拖拽開始、移動和結束。
- 位置交換:在拖拽結束時交換列表項的位置。
代碼實現
1. 組件狀態和變量
@State numbers: string[] = []; // 存儲列表項的數組 moveIndex: number = -1; // 記錄當前被拖拽項的索引
numbers
數組用於存儲列表中的項,而moveIndex
變量用於追蹤當前正在被拖拽的項的索引。2. 拖拽樣式構建器
@Builder pixelMapBuilder(text: string) { Column() { Text(text) .opacity(0) // 拖拽時文本不可見 } }
pixelMapBuilder
方法定義了拖拽過程中顯示的樣式。在這裏,我們將文本的透明度設置爲0,使其在拖拽過程中不可見。3. 初始化數據
aboutToAppear() { this.numbers.fill(null, 0, 15); for (let i = 1; i <= 15; i++) { this.numbers[i - 1] = i + ''; } }
aboutToAppear
方法將被調用,用於初始化列表數據。4. 交換數組位置的方法
changeIndex(index1: number, index2: number) { [this.numbers[index1], this.numbers[index2]] = [this.numbers[index2], this.numbers[index1]]; }
changeIndex
方法用於交換數組中兩個位置的元素,這是實現拖拽功能的核心。5. 組件構建方法
build() { Column({ space: 10 }) { List({ space: 10 }) { ForEach(this.numbers, (day: string, index: number) => { ListItem() { Text(day) // 列表項樣式設置 } .transition({ type: TransitionType.Insert, translate: { y: 5 } }); }) // 拖拽事件處理 .onItemDragStart((event, itemIndex) => { this.moveIndex = itemIndex; return this.pixelMapBuilder(this.numbers[itemIndex]); }) .onItemDragMove((event, itemIndex, insertIndex) => { if (this.moveIndex !== insertIndex) { animateTo({ duration: 300 }, () => { this.changeIndex(this.moveIndex, insertIndex); this.moveIndex = insertIndex; }); } }); } // 其他佈局和樣式設置 } }
build
方法中,我們創建了一個Column
佈局,並在其中嵌套了一個List
組件。ForEach
遍歷numbers
數組,爲每個元素創建一個列表項。我們還爲列表項添加了插入時的過渡動畫效果。.onItemDragStart
和.onItemDragMove
方法處理。在拖拽開始時,我們記錄下被拖拽項的索引,並創建拖拽樣式。在拖拽移動時,如果插入索引發生變化,我們執行位置交換,並更新moveIndex
。