转载请标明出处:http://blog.csdn.net/sk719887916/article/details/40074663,作者:skay
最近项目中遇到一个LIstview的拖动效果,github上一搜发现有叫DragListview的开源项目,然后自己再小手一搜拖动排序的GridView,却没发现什么很全很好的开源项目,后来在博客上发现有一遍比较好的拖动排序的文章,可是跟自己的期望的IOS Luncher效果一比,相差那甚远,因此就在别人的代码基础加以开发,好的利用,不好的摒弃。
一 UI和功能分析
发现目前主流的安卓厂商的手机桌面应用已经实现了此效果,也有APP实现的,如有UC浏览器,但是他貌似无抖动效果。先就Ios的桌面效果作如下需求总结:
我们可以把ios的luncher拆分一下 如下图:
特此我们可以将两个fragment加入同一个activty中,当然也可以将两个gridview放到一个线性布局中,即可,先从上面的Gridview进行分析。
1 GridView长按支持拖动排序,并支持Item实时交换。
2 GridView长按Item出现有抖动效果。
3 Item条目有抖动效果,时不需要长按点击就可以进行拖动效果。
4 拖动的Item和被拖动的Item左标完全重合后可新建文件夹
5 长按Item 出现删除按钮,此时点击删除按钮可以任意删除某一item
6 GridView横竖屏排列列数改变,横屏的行数是竖屏幕的列数
- 根据手指按下的X,Y坐标来获取我们在GridView上面点击的item位置
- 根据当前屏幕状态,动态设置gridview的列数。做到横竖屏展现不同个列数的效果。
- 长按手指达不到规定的时间阀值,将无法拖动状态。时间超过将松开手指后,将gridView的子控件一次开启抖动动画。
- 如果我们长按了item则隐藏item,然后使用WindowManager来添加一个item的镜像在屏幕用来代替刚刚隐藏的item
- 当我们手指在屏幕移动的时候,更新item镜像的位置,然后在根据手指移动的X,Y的坐标来确定当前镜像的位置。
- 到GridView的item过多的时候,可能一屏幕显示不完,我们手指拖动item镜像到屏幕下方,要触发GridView想上滚动,同理,当我们手指拖动item镜像到屏幕上面,触发GridView向下滚动
- GridView交换数据,刷新界面,移除item的镜像,显示被影藏的item.
- 当抖动效果出现,点击删除按钮时,为了赠加移动效果,将要删除的item和末位item交换,然后删除lastItem,通知适配器更新数据。
- 抖动效果出现后,如果Onclick,就视为可拖动状态。
接下来就开始实现需求所列的效果了。为了实现上面需求,需要写一个Gridview,Adapter,和抖动动画。包括移动是的动画。
二 新建动画控制器
1 item实现抖动效果