网站建站过程分析网站名查找

张小明 2025/12/31 4:10:04
网站建站过程分析,网站名查找,信誉好的网站建设案例,电子商务网站规划与设计# 前言 拖拽排序是一种直观的交互方式#xff0c;用户可以通过长按并拖动来调整列表项的顺序。在笔记应用中#xff0c;拖拽排序可以用于调整笔记的显示顺序、任务清单的优先级、文件夹的排列等场景。一个流畅的拖拽排序功能需要提供清晰的视觉反馈和平滑的动画效果。本文将详…#前言拖拽排序是一种直观的交互方式用户可以通过长按并拖动来调整列表项的顺序。在笔记应用中拖拽排序可以用于调整笔记的显示顺序、任务清单的优先级、文件夹的排列等场景。一个流畅的拖拽排序功能需要提供清晰的视觉反馈和平滑的动画效果。本文将详细介绍如何在Flutter和OpenHarmony平台上实现拖拽排序功能。Flutter ReorderableListViewFlutter提供了ReorderableListView组件实现拖拽排序。classReorderableNotesPageextendsStatefulWidget{override_ReorderableNotesPageStatecreateState()_ReorderableNotesPageState();}class_ReorderableNotesPageStateextendsStateReorderableNotesPage{ListNote_notes[Note(id:1,title:笔记一),Note(id:2,title:笔记二),Note(id:3,title:笔记三),Note(id:4,title:笔记四),];overrideWidgetbuild(BuildContextcontext){returnReorderableListView.builder(itemCount:_notes.length,itemBuilder:(context,index){returnListTile(key:ValueKey(_notes[index].id),title:Text(_notes[index].title),trailing:ReorderableDragStartListener(index:index,child:Icon(Icons.drag_handle),),);},onReorder:(oldIndex,newIndex){setState((){if(newIndexoldIndex)newIndex--;finalitem_notes.removeAt(oldIndex);_notes.insert(newIndex,item);});},);}}ReorderableListView.builder是构建可排序列表的推荐方式。每个列表项必须有唯一的key通常使用数据的id。ReorderableDragStartListener提供拖拽手柄用户可以通过拖动手柄来排序而不是长按整个列表项。onReorder回调在排序完成时触发需要手动更新数据列表的顺序。注意当newIndex大于oldIndex时需要减1这是因为移除元素后索引会发生变化。ReorderableListView.builder(itemCount:_notes.length,proxyDecorator:(child,index,animation){returnAnimatedBuilder(animation:animation,builder:(context,child){finalelevationlerpDouble(0,8,animation.value);returnMaterial(elevation:elevation!,shadowColor:Colors.black45,child:child,);},child:child,);},itemBuilder:(context,index){returnNoteCard(key:ValueKey(_notes[index].id),note:_notes[index],);},onReorder:_handleReorder,)proxyDecorator属性可以自定义拖拽时的视觉效果。animation参数提供拖拽动画的进度值可以用于创建动态效果。这里使用lerpDouble在0和8之间插值计算阴影高度拖拽时卡片会浮起并显示阴影增强拖拽的视觉反馈。Material组件提供阴影效果让拖拽的项目看起来悬浮在其他项目之上。自定义拖拽效果有时需要更精细地控制拖拽行为。classDraggableNoteListextendsStatefulWidget{override_DraggableNoteListStatecreateState()_DraggableNoteListState();}class_DraggableNoteListStateextendsStateDraggableNoteList{ListNote_notes[];int?_draggingIndex;overrideWidgetbuild(BuildContextcontext){returnListView.builder(itemCount:_notes.length,itemBuilder:(context,index){returnLongPressDraggableint(data:index,feedback:Material(elevation:8,child:SizedBox(width:MediaQuery.of(context).size.width-32,child:NoteCard(note:_notes[index]),),),childWhenDragging:Opacity(opacity:0.5,child:NoteCard(note:_notes[index]),),onDragStarted:(){setState(()_draggingIndexindex);},onDragEnd:(details){setState(()_draggingIndexnull);},child:DragTargetint(onAccept:(fromIndex){_reorderNotes(fromIndex,index);},builder:(context,candidateData,rejectedData){returnNoteCard(note:_notes[index],isHighlighted:candidateData.isNotEmpty,);},),);},);}}LongPressDraggable和DragTarget组合可以实现更灵活的拖拽排序。LongPressDraggable在长按时开始拖拽feedback是拖拽时显示的WidgetchildWhenDragging是原位置显示的Widget。DragTarget是放置目标onAccept在拖拽项放置时触发。candidateData包含当前悬停在目标上的数据可以用于显示高亮效果。这种方式提供了完全的控制权可以实现任意复杂的拖拽交互。void_reorderNotes(int fromIndex,int toIndex){setState((){finalitem_notes.removeAt(fromIndex);if(toIndexfromIndex)toIndex--;_notes.insert(toIndex,item);_saveOrder();});}Futurevoid_saveOrder()async{finalorderData_notes.map((n)n.id).toList();awaitNoteService.saveNoteOrder(orderData);}排序完成后通常需要持久化保存新的顺序。_saveOrder方法将笔记ID列表保存到本地存储或服务器。这样用户下次打开应用时可以看到之前调整的顺序。排序数据的持久化是拖拽排序功能完整性的重要组成部分。OpenHarmony拖拽排序OpenHarmony通过List组件的拖拽功能实现排序。EntryComponentstruct ReorderableNotesPage{StatenoteList:NoteItem[][{id:1,title:笔记一},{id:2,title:笔记二},{id:3,title:笔记三},{id:4,title:笔记四}]build(){List(){ForEach(this.noteList,(item:NoteItem,index:number){ListItem(){Row(){Text(item.title).fontSize(16).layoutWeight(1)Image($r(app.media.drag_handle)).width(24).height(24).fillColor(#999999)}.width(100%).padding(15).backgroundColor(#FFFFFF)}},(item:NoteItem)item.id)}.editMode(true).onItemMove((from:number,to:number){this.moveItem(from,to)returntrue})}moveItem(from:number,to:number){letitemthis.noteList.splice(from,1)[0]this.noteList.splice(to,0,item)}}OpenHarmony的List组件通过editMode属性启用编辑模式在编辑模式下可以拖拽排序。onItemMove回调在拖拽排序时触发from和to分别是原索引和目标索引。ForEach的第二个参数是key生成函数确保每个项有唯一标识。moveItem方法使用splice操作数组实现元素移动。返回true表示接受这次移动操作。List(){ForEach(this.noteList,(item:NoteItem,index:number){ListItem(){this.NoteItemBuilder(item)}.swipeAction({end:this.DeleteButtonBuilder(index)})},(item:NoteItem)item.id)}.editMode(this.isEditMode).onItemMove((from:number,to:number){this.moveItem(from,to)returntrue}).onItemDelete((index:number){this.deleteItem(index)returntrue})BuilderDeleteButtonBuilder(index:number){Button(删除).backgroundColor(#FF4D4F).onClick((){this.deleteItem(index)})}List组件还支持滑动操作和删除功能。swipeAction配置滑动时显示的操作按钮end表示从右侧滑出。onItemDelete回调在删除操作时触发。这些功能可以与拖拽排序结合使用提供完整的列表管理能力。isEditMode状态变量可以控制是否启用编辑模式让用户在浏览和编辑模式之间切换。网格拖拽排序网格布局的拖拽排序适合图片或卡片的排列。ReorderableGridView.builder(gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:2,crossAxisSpacing:12,mainAxisSpacing:12,),itemCount:_notes.length,itemBuilder:(context,index){returnCard(key:ValueKey(_notes[index].id),child:Center(child:Text(_notes[index].title)),);},onReorder:(oldIndex,newIndex){setState((){finalitem_notes.removeAt(oldIndex);_notes.insert(newIndex,item);});},)ReorderableGridView提供网格布局的拖拽排序功能。gridDelegate配置网格的列数和间距与普通GridView的配置方式相同。拖拽时其他项会自动让出位置形成流畅的重排动画。网格拖拽排序适合笔记缩略图、图片相册等场景。拖拽排序的视觉反馈良好的视觉反馈可以提升拖拽体验。DragTargetint(onWillAccept:(data)data!index,onAccept:(fromIndex)_reorderNotes(fromIndex,index),builder:(context,candidateData,rejectedData){returnAnimatedContainer(duration:Duration(milliseconds:200),decoration:BoxDecoration(border:candidateData.isNotEmpty?Border.all(color:Colors.blue,width:2):null,borderRadius:BorderRadius.circular(8),),child:NoteCard(note:_notes[index]),);},)当拖拽项悬停在目标上方时显示蓝色边框作为放置提示。AnimatedContainer为边框的出现和消失添加动画效果。onWillAccept可以判断是否接受拖拽这里排除了拖拽到自身的情况。这种视觉反馈让用户清楚地知道可以放置的位置。总结拖拽排序是一种直观高效的交互方式Flutter和OpenHarmony都提供了相应的实现方案。开发者需要关注拖拽的视觉反馈、动画效果和数据持久化为用户提供流畅自然的排序体验。在笔记应用中拖拽排序可以让用户灵活地组织笔记顺序提升内容管理的效率。欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设中源码编程同样重要wordpress 插件 缓存

第一章:Open-AutoGLM 本地部署指南在本地环境中部署 Open-AutoGLM 可以实现对大语言模型的完全控制,适用于数据敏感性高或离线运行需求的场景。部署过程主要包括环境准备、依赖安装、模型获取与服务启动四个关键环节。环境准备 确保系统已安装 Python 3.…

张小明 2025/12/31 4:09:32 网站建设

想做个网站要多少钱矿坛器材友情交换

如何让STM32稳稳“听”到nRF24L01话筒的声音?从引脚连接到实战避坑全解析你有没有试过,明明代码跑通了、SPI通信也正常,可语音数据就是断断续续、噪声满屏?或者无线模块动不动就“失联”,重传次数爆表?这很…

张小明 2025/12/31 4:08:58 网站建设

工商网站注册公司绍兴企业自助建站

西门子S7-1500系列,1511PLC 自动配料系统 PID程序控阀门开度 ,模拟量转换 ,博途画面 ,程序完整 ,适合程序参照和学习,博图15及以上可以打开 特殊商品在自动化生产领域,西门子S7 - 1500系列PLC凭…

张小明 2025/12/31 4:08:24 网站建设

邢台网站建设基本流程使用动易模版制作网站

小狼毫输入法多语言界面配置终极指南:打造个性化输入体验 【免费下载链接】weasel 【小狼毫】Rime for Windows 项目地址: https://gitcode.com/gh_mirrors/we/weasel 小狼毫输入法(Rime for Windows)作为一款功能强大的开源输入法平台…

张小明 2025/12/31 4:07:49 网站建设

由于建设网站需要室内设计网站有哪些知乎

Codeforces竞赛神器:Carrot插件3步实现实时rating预测 【免费下载链接】carrot A browser extension for Codeforces rating prediction 项目地址: https://gitcode.com/gh_mirrors/carrot1/carrot 还在为Codeforces比赛结束后漫长的rating等待而焦虑吗&…

张小明 2025/12/31 4:07:14 网站建设

php程序员网站开发建设贵阳app软件开发

抖音批量下载神器:一键搞定无水印视频和直播内容 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为手动保存抖音视频而烦恼吗?douyin-downloader这款专业工具能够帮你轻松实现抖音…

张小明 2025/12/31 4:06:40 网站建设