当前位置: 首页 > news >正文

Harmony开发 List、Grid拖动自定义排序实现

1. Harmony开发 List、Grid拖动自定义排序实现

1.1. List拖动功能

  本示例基于显式动画、List组件实现了ListItem的上下拖动、ListItem切换以及ListItem插入的效果。
在这里插入图片描述
  实现思路:List手势拖动

@Entry
@Component
struct ListDragPage {@State private arr: string[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14].map((value) => value.toString())private listScroller: ListScroller = new ListScroller();private dragIndex: number = -1private originDragIndex: number = -1@State itemOffsetList: number[] = []private itemHeight: number = 100private listMargin: number = 10private itemTotalHeight: number = 110// dragItem距离List组件顶部的距离private dragOffsetY: number = 0// dragItem相对于List滚动顶部的距离private relativeOffsetY: number = 0// List组件能滑动的最大距离listMaxScrollOffsetY: number = 0// List组件开始拖动时的偏移originListOffsetY: number = 0// list组件规格private listArea: Area = {width: 0,height: 0,position: {},globalPosition: {}}aboutToAppear(): void {this.itemOffsetList = new Array<number>(this.arr.length)}initState() {for (let i = 0; i < this.itemOffsetList.length; i++) {this.itemOffsetList[i] = 0}this.dragIndex = -1this.originDragIndex = -1this.dragOffsetY = 0this.originListOffsetY = this.listScroller.currentOffset().yOffset}startDragItem(dragIndex: number) {this.initState()animateTo({ curve: Curve.Linear }, () => {this.dragIndex = dragIndexthis.originDragIndex = dragIndex})}increaseDragIndex(eventOffsetY: number) {let tmp = this.arr.splice(this.dragIndex, 1)this.arr.splice(this.dragIndex + 1, 0, tmp[0])this.dragIndex = this.dragIndex + 1this.itemOffsetList[this.dragIndex] =eventOffsetY - (this.dragIndex - this.originDragIndex) * this.itemTotalHeight +this.listScroller.currentOffset().yOffset - this.originListOffsetYthis.itemOffsetList[this.dragIndex - 1] = this.itemTotalHeightanimateTo({ curve: Curve.Sharp, duration: 100 }, () => {this.itemOffsetList[this.dragIndex - 1] = 0})}decreaseDragIndex(eventOffsetY: number) {let tmp = this.arr.splice(this.dragIndex, 1)this.arr.splice(this.dragIndex - 1, 0, tmp[0])this.dragIndex = this.dragIndex - 1this.itemOffsetList[this.dragIndex] =eventOffsetY - (this.dragIndex - this.originDragIndex) * this.itemTotalHeight +this.listScroller.currentOffset().yOffset - this.originListOffsetYthis.itemOffsetList[this.dragIndex + 1] = -this.itemTotalHeightanimateTo({ curve: Curve.Sharp, duration: 100 }, () => {this.itemOffsetList[this.dragIndex + 1] = 0})}cancelDrag() {this.initState()}endDragItem() {animateTo({ curve: Curve.Sharp, duration: 100 }, () => {this.initState()})}build() {Column() {List({ space: this.listMargin

相关文章:

  • Spring之Bean的初始化 Bean的生命周期 全站式解析
  • LeetCode Hot100刷题——轮转数组
  • 【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
  • docker-compose——安装mongo
  • 搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
  • 构建集成差异化灵巧手和先进机器人控制技术的自动化系统
  • Active Directory域环境信息收集实战指南
  • 【网络入侵检测】基于Suricata源码分析运行模式(Runmode)
  • 【诊所电子处方专用软件】佳易王个体诊所门诊电子处方开单管理系统:零售药店电子处方服务系统#操作简单#诊所软件教程#药房划价
  • 【C++ - 仿mudou库one thread one loop式高并发服务器实现】
  • IntraWeb 16.0.2 + Bootstrap 4 居中布局实战(附源码+效果图)
  • 5000 字总结CSS 中的过渡、动画和变换详解
  • 数据库blog1_信息(数据)的处理与效率提升
  • Unity序列化字段、单例模式(Singleton Pattern)
  • Redis 发布订阅模式深度解析:原理、应用与实践
  • 制作大风车动画
  • Mipsel固件Fuzzing小记
  • 永磁同步电机公式总结——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程
  • Node.js 源码架构详解
  • 【磁盘清理】C盘告急,给JetBrains缓存文件搬个家
  • 柬埔寨果农:期待柬埔寨榴莲走进中国市场
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • 俄媒:俄乌代表团抵达谈判会场
  • 董军在第六届联合国维和部长级会议上作大会发言
  • 科普|男性这个器官晚到岗,可能影响生育能力
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记