1.ItemTouchHelper实现RecyclerView拖拽&合并的源码效果
2.封装avalonia指定组件允许拖动的工具类
ItemTouchHelper实现RecyclerView拖拽&合并的效果
左侧栏展示的是一个RecyclerView,通过手势拖拽可以实现排序功能,源码还能将图标合并为文件夹,源码类似于桌面应用图标合并的源码交互体验。
实现此功能的源码核心是利用ItemTouchHelper.Callback。它能够快速处理拖拽排序和滑动移除效果,源码easyui项目源码但为了达到合并效果,源码需要对此进行改造。源码
核心思路在于:
1. 重写chooseDropTarget()方法,源码当两个viewHolder重叠部分满足合并条件时,源码暂存这两个viewHolder。源码不满足则清空暂存变量。源码
2. 在拖拽结束时,源码即手抬起时,源码若暂存变量非空,源码则触发合并逻辑。
深入源码:
理解ItemTouchHelper的实现原理,是改造的基础。拖动viewHolder时,触摸事件由mOnItemTouchListener#onTouchEvent()分发,处理MotionEvent.ACTION_MOVE事件后,nocodb源码分析通过moveIfNecessary(ViewHolder viewHolder)实现位置交换。
具体实现:
1. 重写chooseDropTarget(),在重叠状态时暂存viewHolder,并确保在重叠情况下返回null,以阻止默认行为。
2. 重写onSelectedChanged(),在拖动结束时判断是否需要触发合并操作。
接口封装:
为了更好地实现功能,封装了三个接口:IDragAdapter、IDragItem、短信java源码IDragHandler,分别对应适配器、列表拖拽项和拖拽处理,便于根据场景实现特定功能。
具体实现:
1. IDragItem接口描述列表拖拽项接口,由RecyclerView的具体ViewHolder实现,用于判断是否可以拖动、合并和显示拖拽状态。
2. IDragAdapter接口描述适配器接口,由RecyclerView的系统源码29800具体Adapter实现。
3. IDragHandler接口描述拖拽处理接口,用于拖拽条件判断、回调监听、合并处理逻辑。接入拖拽功能时,需实现此接口,并通过DragTouchCallback#setDragHandler()赋值。
使用方法:
实现IDragHandler#onMergeData()接口方法,绑定RecyclerView使用DragTouchCallback。在完成IDragHandler注册并绑定recyclerView后,dma源码公开即可实现拖拽、合并效果。
总结:
文章提供了一个从原理理解到具体实现的完整流程,包括源码分析、接口设计和使用指南。git项目中有相关Demo演示,感兴趣的开发者可以参考学习。
项目地址:[GitHub链接]。感谢阅读至此,演示效果包括合并文件夹和合并相加。
封装avalonia指定组件允许拖动的工具类
创建Avalonia的MVVM项目,项目命名为DragDemo。确保Nuget包更新至预览版。
项目更新后,ViewLocator和App.axaml可能出现错误。修改ViewLocator.cs如下:
引入Avalonia.Themes.Fluent,因为它在预览版中独立,需单独安装。
打开App.axaml,调整代码以满足项目需求。
在Views/MainWindow.axaml中,添加代码使窗口无边框,设置窗口尺寸为Height="" Width="",确保界面简洁。
在上述窗口中添加代码以实现无边框效果。
打开Views/MainWindow.axaml.cs,调整代码设置窗口无边框并使窗口透明。
查看效果,限制窗口大小并添加透明区块,使窗口悬浮。
接下来,编写指定组件的拖动工具类,创建DragControlHelper.cs。定义ConcurrentDictionary用于组件与DragModule映射,DragModule封装拖动逻辑。在调用StartDrag方法时,传入组件,生成DragModule,创建定时器在鼠标按下时启动,在鼠标释放时停止,以平滑移动窗口,避免抖动。
在MainWindow.axaml.cs中修改代码,渲染成功后获取需要移动的组件,调用DragControlHelper.StartDrag方法。确保在卸载窗口时解除组件绑定。
展示效果如下,通过技术分享和交流群进行分享与讨论。