build() {
Column({ space: 5 }) {
Column() {
Grid(this.scroller) {
ForEach(this.numbers, (day: string, index: number) => {
GridItem() {
Text(day)
.fontSize(16)
.backgroundColor(0xF9CF93)
.width('100%')
.height(70)
.textAlign(TextAlign.Center)
}.id('t'+day)
})
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.columnsGap(10)
.rowsGap(10)
.onScrollIndex((first: number) => {
console.info(first.toString())
})
.width('90%')
.backgroundColor(0xFAEEE0)
.supportAnimation(this.bo) // 设置支持拖拽动画
.editMode(true) //设置Grid是否进入编辑模式,进入编辑模式可以拖拽Grid组件内部GridItem
.onItemDragStart((event: ItemDragInfo, itemIndex: number) => { //第一次拖拽此事件绑定的组件时,触发回调。
//index 0-3的元素不允许拖动
if (itemIndex < 4) {
return
}
this.text = this.numbers[itemIndex]
this.itemWidth = this.scroller.getItemRect(itemIndex).width
return this.pixelMapBuilder() //设置拖拽过程中显示的图片。
})
.onItemDragMove((event: ItemDragInfo, itemIndex: number, insertIndex: number) => { //拖拽在网格元素范围内移动时触发
// 获取即将插入的子组件的位置来判断是否更改supportAnimation属性
let yy = this.scroller.getItemRect(insertIndex).y
if (yy==0 && this.bo){ // 前四个在第一行不移动,所以判断==0。 依次类推第二行第三行根据高度计算
this.bo=false
}else if (yy>0 && !this.bo){
this.bo=true;
}
console.info('yy:'+yy)
})
.onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => { //绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。
// isSuccess=false时,说明drop的位置在grid外部;insertIndex > length时,说明有新增元素的事件发生
if (!isSuccess || insertIndex >= this.numbers.length) {
return
}
// index为0-3的元素不允许替换
if (insertIndex <4) {
return
}
console.info('测试' + itemIndex + '', insertIndex + '') //itemIndex拖拽起始位置,insertIndex拖拽插入位置
this.changeIndex(itemIndex, insertIndex)
})
}
}.width('100%').margin({ top: 5 })
}
}
请参考: