Launcher3分析之拖动图标的流程——按住

(系列文章点这里)

拖动图标是Launcher的特色,非常形象地解释了如何改变桌面的布局,让小白用户也可以轻松上手,这背后所做的工作也是把复杂的东西简单化,简单到按下-移动-松开。

今天说一说这个按下的过程是如何产生的。这里说的按是长按,长按就要找到他的长按监听器。在Workspace中addInScreen方法最后,给图标设置的监听器是Launcher对象,他实现了onLongClick方法。

拖动的流程-按下

onLongClick里面有一大坨东西,因为很多东西都需要处理长按事件。我们直接看函数最后的调用Workspace.startDrag,这里就是拖动的起点,函数名很直观“开始拖动”。

startdrag这里做一些准备工作,先把点击的图标设置成不可见,然后放弃焦点,将按下的状态设置成false,设置成false之后,按下时候的白边就消失了。接下来通过createDragOutline生成一个轮廓线,这个轮廓线就是用来指示你图标会被放在哪个位置的,你不断拖动,这个轮廓线的位置也在不断变化。最后进入beginDragShared方法,他其实就干了两个事,生成随手动的Bitmap,把工作交接给DragController.startDrag。

DragController是桌面里面的拖拽控制器,一旦他的startDrag执行完了,就可以接收滑动的触摸消息了。

startDrag-dragcontroller在上图中,开始调用了拖拽监听器(DragListener之后会讲),然后把mDragging设为true,标识他进入了拖拽过程。mDragObject包含了拖拽时候所需的必要信息,在其他很多地方都有调用。而dragView使随手而动的view,通过上面生成的那个bitmap合成而来,通过show方法显示在某个位置上,你在屏幕上滑动的时候,这个dragView的坐标也在一直变化。handleMoveEvent在最后会被调用,他是用来处理ACTION_MOVE事件的,你可能会问,这个时候还没有开始拖动,怎么会有MOVE事件呢?其实。。。。。我也不知道,哈哈

下一次会说说ACTION_MOVE的处理流程,包括DropTarget,DragSource等概念。

 

 

 

关于 “Launcher3分析之拖动图标的流程——按住” 的 7 个意见

发表评论

电子邮件地址不会被公开。