您的位置:首页 > 其它

(9)Launcher3分析之拖动图标的流程——放下

2014-10-07 09:21 204 查看
我们来看下放下的过程,对应的触摸事件是ACTION_UP,我们直接跳到DragController的onTouchEvent。在处理ACTION_UP的时候多调用了一次handleMoveEvent,可能是因为ACTION_UP相对于上一次的时间也会有位置的变化。



松手的时候会判断是是不是在“扔”图标(通过isFlingingToDelete),如果你用的不仔细的话,可能发现不了这个扔的过程:在说面拖动某个图标,然后快速甩向屏幕上方,就会触发删除的事件。这里检查你是否在扔是通过VelocityTracker来计算的,他会记录每次事件,然后计算出速度,包括X方向和Y方向的。如果不是在“扔”,就会调用放下图标最重要的一个方法,drop方法。





首先他会通过当前的坐标找到需要放到的DropTarget,放下的操作首先得保证有DropTarget,然后DropTarget还得需要接受你手上的图标,比如你把图标拖到已经放满的Hotseat上去肯定不能被接受(DropTarget.acceptDrop返回false)。被接受了就可以调用当前DropTarget的onDrop方法了,我们以Workspace为例,他做了一下几件事:

寻找最近的位置
如果这个位置已经被占用,如果是快捷方式,会在条件满足的时候创建文件夹,结束
如果这个位置已经被占用,如果是文件夹,会在满足条件的时候把图标放入文件夹,结束
如果上面的条件都没有满足,找到一个空位,没找到的话,弹回原来的位置。
如果找到空位,则会改变位置,修改数据库。
生成一个往下放的动画,清除dragView。

上面的过程代码十分繁杂,因为没有对这方面进行过修改和自定义,所以也有很多不清楚的地方。

在drop方法里面,最后还有一个调用,这个调用的是DragSource的方法,DragSource代表着拖动的源头,跟DropTarget正好相反,DragSource的子类也就是Workspace,文件夹,widget列表。onDropCompleted是DragSource最重要的回调,主要做一些善后的操作。

drop()方法执行完毕之后,需要调用DragController.endDrag(),这个方法会把mDragging置为false,清理dragview,调用DragListener的onDragEnd方法。最后释放VelocityTracker,等待下一轮触摸事件的来临。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: