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

(系列文章点这里)

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

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

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,等待下一轮触摸事件的来临。

 

 

关于 “Launcher3分析之拖动图标的流程——放下” 的 1 个意见

  1. 你好,sdfdsasdfdsadfsdfsadfasdfsdfsdfsdfasdfsdfsdfasdfasdfasdfsdafsdfds
    fdsafasdfsadfsadfsadfsdfsdfasdfsd
    asfdafasdfasddsfsdl;skjfd;aljf;lsdj;lajf;lkjsalkfj;sajdfl;jsl;fjdals;djfl;asdjfla;sjd;flsjfdal;sjdf;lsjfoeiwurpqewrupoweifxmv/zxmcv,nzcx,.vnakafashdfowepqiruqoweuro[sdfdajlkjxclvc,xnvm,cnb.cz,mvnzx/,cmnv/nkd;afjksdfjadlsfoqiweruewjfaskldfjadl;fkjas;ldfklv,xcnv,x.cnvm,.znjdksfahsdfks;jfl;kjas;ldfjas;lafjsd;lfjasd;lfasdfjdfajsdfsdjfjsdlf;asjflaskdfjsdl;fjasdlfkdsfjasldkfsdjfal;ksjdflasdjfl;asjdfl;asjdfla;sdjfl;asjdflksdfal;sdfjalskdfjslajfsl;dajflsdjflas;fjasl;dfjas;dfjla;sdjfadls;fjslad;fjas;djflds;mvc.xv,.xmz/.mcv/.mxc/vz./vcmzx/.,vzxmv/zxm/.xm,v/z.,mxc/v.,xmv/z.x,cmvzx.cvmzxc./,vmz/x.vmx/z.cvm/z.xcmvz/x.c,mvz/x.cmv/.zxmv/.zmxcv/.zcxmv/.zxmcv/.zmxcv/.zmxcv/.zmxcvzxmv.xz/mvmz/x.cvm.z/xvz/xcmv/zxmv/.zxmvc.zmxcv./zxmcv./zxmcv./zcxmv./zxmcv/.zmxv/.zcmv/ 🙄 😳 :mrgreen: 💡 👿 😆 ❓ 😐 😡 😮 😛 😀 🙁 ❗ 😡 😳 🙄 💡 👿 ➡ ❓ 😡 😛 😀 🙂 😆

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注